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
kfield enthält den Feldnamen im Originaldokument. - Das
vfield 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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 }