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 }