sql >> Database >  >> NoSQL >> MongoDB

MongoDB $objectToArray

In MongoDB is de $objectToArray aggregatiepijplijnoperator converteert een document naar een array.

De array geproduceerd door $objectToArray bevat een element voor elk veld/waarde-paar in het originele document. Elk element is een document dat een k . bevat veld en een v veld:

  • De k veld bevat de veldnaam in het originele document.
  • De v veld bevat de waarde van het veld in het originele document.

Voorbeeld

Stel dat we een verzameling hebben met de naam dogs met het volgende document:

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

We kunnen de $objectToArray . gebruiken operator om de specs te retourneren veld als een array:

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

Resultaat:

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

Geneste documenten

De $objectToArray operator is alleen van toepassing op het veld op het hoogste niveau. Het is niet recursief van toepassing op ingesloten documenten.

Stel dat we een document hebben zoals dit:

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

Dit is wat er gebeurt als we $objectToArray toepassen naar dat document:

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

Resultaat:

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

In dit geval wordt het document op het hoogste niveau geconverteerd naar de k /v formaat, maar het ingesloten document blijft hetzelfde als in het originele document.

Verkeerd type

Het argument geleverd aan $objectToArray kan elke geldige uitdrukking zijn, zolang deze maar wordt omgezet in een documentobject.

Als het argument niet wordt omgezet in een documentobject, treedt er een fout op.

Stel dat we het volgende document hebben:

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

De specs veld bevat een tekenreeks.

Dit is wat er gebeurt als we $objectToArray toepassen naar dat document:

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

Resultaat:

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

Zoals de fout aangeeft, vereist $objectToArray requires a document input .

Null-waarden

null opgeven resulteert in null .

Stel dat we het volgende document hebben:

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

En we passen $objectToArray . toe :

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

Resultaat:

{ "result" : null }

Ontbrekende velden

Als het veld ontbreekt, is het resultaat null .

Stel dat we het volgende document hebben:

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

En we passen $objectToArray . toe :

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

Resultaat:

{ "result" : null }


  1. Geneste structuren opslaan met mgo

  2. MongoDB en PostgreSQL-gedachten

  3. Logboekregistratie configureren voor het MongoDB Java-stuurprogramma

  4. Is het mogelijk om meerdere cache-stores te maken met Spring's cache-abstractie met redis?