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

MongoDB $objectToArray

I MongoDB er $objectToArray aggregeringspipeline-operatør konverterer et dokument til et array.

Arrayet produceret af $objectToArray indeholder et element for hvert felt/værdipar i det originale dokument. Hvert element er et dokument, der indeholder en k felt og en v felt:

  • k felt indeholder feltnavnet i det originale dokument.
  • v feltet indeholder værdien af ​​feltet i det originale dokument.

Eksempel

Antag, at vi har en samling kaldet dogs med følgende dokument:

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

Vi kan bruge $objectToArray operatør for at returnere specs felt som en matrix:

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"
		}
	]
}

Indlejrede dokumenter

$objectToArray operatør gælder kun for feltet på øverste niveau. Det gælder ikke rekursivt for indlejrede dokumenter.

Antag, at vi har et dokument som dette:

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

Her er, hvad der sker, når vi anvender $objectToArray til det dokument:

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 dette tilfælde konverteres dokumentet på øverste niveau til k /v format, men det indlejrede dokument forbliver det samme som i det originale dokument.

Forkert type

Argumentet leveret til $objectToArray kan være et hvilket som helst gyldigt udtryk, så længe det løses til et dokumentobjekt.

Hvis argumentet ikke løses til et dokumentobjekt, opstår der en fejl.

Antag, at vi har følgende dokument:

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

specs feltet indeholder en streng.

Her er, hvad der sker, når vi anvender $objectToArray til det dokument:

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 fejlen angiver, kræver $objectToArray requires a document input .

Nul-værdier

Giver null resulterer i null .

Antag, at vi har følgende dokument:

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

Og vi anvender $objectToArray :

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

Resultat:

{ "result" : null }

Manglende felter

Hvis feltet mangler, er resultatet null .

Antag, at vi har følgende dokument:

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

Og vi anvender $objectToArray :

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

Resultat:

{ "result" : null }


  1. Kan ikke oprette forbindelse til Redis fra Docker

  2. Kan redis fuldt ud erstatte mysql?

  3. Redis ydeevne på en multi-core CPU

  4. Hvordan implementerer man Redis Cache med Django Rest Framework?