sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $objectToArray

I MongoDB, $objectToArray aggregeringspipeline-operatör konverterar ett dokument till en array.

Arrayen som produceras av $objectToArray innehåller ett element för varje fält/värdepar i originaldokumentet. Varje element är ett dokument som innehåller en k och en v fält:

  • k fältet innehåller fältnamnet i originaldokumentet.
  • v fältet innehåller värdet för fältet i originaldokumentet.

Exempel

Anta att vi har en samling som heter dogs med följande dokument:

{
	"_id" : 1,
	"name" : "Fetch",
	"specs" : {
		"height" : 400,
		"weight" : 55,
		"color" : "brown"
	}
}

Vi kan använda $objectToArray operatorn för att returnera specs fält som en array:

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
).pretty()

Resultat:

{
	"result" : [
		{
			"k" : "height",
			"v" : 400
		},
		{
			"k" : "weight",
			"v" : 55
		},
		{
			"k" : "color",
			"v" : "brown"
		}
	]
}

Inkapslade dokument

$objectToArray operatören gäller endast för det översta fältet. Det gäller inte rekursivt för några inbäddade dokument.

Anta att vi har ett dokument som detta:

{
	"_id" : 2,
	"name" : "Wag",
	"specs" : {
		"height" : 50,
		"weight" : 5,
		"color" : {
			"eyes" : "brown",
			"coat" : "black"
		}
	}
}

Det här är vad som händer när vi använder $objectToArray till det dokumentet:

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 2 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
).pretty()

Resultat:

{
	"result" : [
		{
			"k" : "height",
			"v" : 50
		},
		{
			"k" : "weight",
			"v" : 5
		},
		{
			"k" : "color",
			"v" : {
				"eyes" : "brown",
				"coat" : "black"
			}
		}
	]
}

I det här fallet konverteras dokumentet på toppnivån till k /v format, men det inbäddade dokumentet förblir detsamma som i originaldokumentet.

Fel typ

Argumentet som tillhandahålls till $objectToArray kan vara vilket giltigt uttryck så länge det löser sig till ett dokumentobjekt.

Om argumentet inte löser sig till ett dokumentobjekt uppstår ett fel.

Anta att vi har följande dokument:

{ "_id" : 3, "name" : "Fetch", "specs" : "None" }

specs fältet innehåller en sträng.

Det här är vad som händer när vi använder $objectToArray till det dokumentet:

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 3 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
)

Resultat:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$objectToArray requires a document input, found: string",
	"code" : 40390,
	"codeName" : "Location40390"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Som felet säger kräver $objectToArray requires a document input .

Nullvärden

Tillhandahåller null resulterar i null .

Anta att vi har följande dokument:

{ "_id" : 4, "name" : "Fetch", "specs" : null }

Och vi tillämpar $objectToArray :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
)

Resultat:

{ "result" : null }

Fält saknas

Om fältet saknas är resultatet null .

Anta att vi har följande dokument:

{ "_id" : 5, "name" : "Fetch" }

Och vi tillämpar $objectToArray :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
)

Resultat:

{ "result" : null }


  1. Spring boot + Redis - Genererar en konstig nyckel

  2. Hierarkiska frågor med Mongo med $graphLookup

  3. MongoDB-fel:Kan inte använda omprövningsbara skrivningar med limit=0

  4. Hur man använder jackson istället för JdkSerializationRedisSerializer på våren