MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $objectToArray

In MongoDB ist das $objectToArray Der Aggregations-Pipeline-Operator konvertiert ein Dokument in ein Array.

Das von $objectToArray erzeugte Array enthält ein Element für jedes Feld/Wert-Paar im Originaldokument. Jedes Element ist ein Dokument, das ein k enthält Feld und ein v Feld:

  • Das k field enthält den Feldnamen im Originaldokument.
  • Das v field enthält den Wert des Felds im Originaldokument.

Beispiel

Angenommen, wir haben eine Sammlung namens dogs mit folgendem Dokument:

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

Wir können das $objectToArray verwenden -Operator, um die specs zurückzugeben Feld als Array:

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

Ergebnis:

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

Verschachtelte Dokumente

Das $objectToArray Der Operator gilt nur für das Feld der obersten Ebene. Es gilt nicht rekursiv für eingebettete Dokumente.

Angenommen, wir haben ein Dokument wie dieses:

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

Folgendes passiert, wenn wir $objectToArray anwenden zu diesem Dokument:

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

Ergebnis:

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

In diesem Fall wird das Dokument der obersten Ebene in den k konvertiert /v Format, aber das eingebettete Dokument bleibt dasselbe wie im Originaldokument.

Falscher Typ

Das für $objectToArray bereitgestellte Argument kann jeder gültige Ausdruck sein, solange er in ein Dokumentobjekt aufgelöst wird.

Wenn das Argument nicht in ein Dokumentobjekt aufgelöst wird, tritt ein Fehler auf.

Angenommen, wir haben das folgende Dokument:

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

Die specs Feld enthält eine Zeichenkette.

Folgendes passiert, wenn wir $objectToArray anwenden zu diesem Dokument:

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

Ergebnis:

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

Wie der Fehler besagt, erfordert $objectToArray requires a document input .

Nullwerte

Bereitstellung von null ergibt null .

Angenommen, wir haben das folgende Dokument:

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

Und wir wenden $objectToArray an :

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

Ergebnis:

{ "result" : null }

Fehlende Felder

Wenn das Feld fehlt, ist das Ergebnis null .

Angenommen, wir haben das folgende Dokument:

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

Und wir wenden $objectToArray an :

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

Ergebnis:

{ "result" : null }