MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $objectToArray

In MongoDB, il $objectToArray l'operatore della pipeline di aggregazione converte un documento in una matrice.

L'array prodotto da $objectToArray contiene un elemento per ogni coppia campo/valore nel documento originale. Ogni elemento è un documento che contiene un k campo e un v campo:

  • Il k campo contiene il nome del campo nel documento originale.
  • Il v campo contiene il valore del campo nel documento originale.

Esempio

Supponiamo di avere una collezione chiamata dogs con il seguente documento:

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

Possiamo usare il $objectToArray operatore per restituire le specs campo come matrice:

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

Risultato:

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

Documenti nidificati

Il $objectToArray l'operatore si applica solo al campo di livello superiore. Non si applica ricorsivamente ad alcun documento incorporato.

Supponiamo di avere un documento come questo:

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

Ecco cosa succede quando applichiamo $objectToArray a quel documento:

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

Risultato:

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

In questo caso, il documento di livello superiore viene convertito in k /v formato, ma il documento incorporato rimane lo stesso del documento originale.

Tipo errato

L'argomento fornito a $objectToArray può essere qualsiasi espressione valida purché si risolva in un oggetto documento.

Se l'argomento non si risolve in un oggetto documento, si verifica un errore.

Supponiamo di avere il seguente documento:

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

Le specs il campo contiene una stringa.

Ecco cosa succede quando applichiamo $objectToArray a quel documento:

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

Risultato:

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

Come indica l'errore, $objectToArray requires a document input .

Valori Nulli

Fornendo null risulta null .

Supponiamo di avere il seguente documento:

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

E applichiamo $objectToArray :

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

Risultato:

{ "result" : null }

Campi mancanti

Se il campo è mancante, il risultato è null .

Supponiamo di avere il seguente documento:

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

E applichiamo $objectToArray :

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

Risultato:

{ "result" : null }