I MongoDB, $objectToArray
aggregeringspipeline-operatör konverterar ett dokument till en array.
Arrayen som produceras av $objectToArray
innehåller ett element för varje fält/värdepar i originaldokumentet. Varje element är ett dokument som innehåller en k
och en v
fält:
k
fältet innehåller fältnamnet i originaldokumentet.v
fältet innehåller värdet för fältet i originaldokumentet.
Exempel
Anta att vi har en samling som heter dogs
med följande dokument:
{ "_id" : 1, "name" : "Fetch", "specs" : { "height" : 400, "weight" : 55, "color" : "brown" } }
Vi kan använda $objectToArray
operatorn för att returnera specs
fält som en array:
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" } ] }
Inkapslade dokument
$objectToArray
operatören gäller endast för det översta fältet. Det gäller inte rekursivt för några inbäddade dokument.
Anta att vi har ett dokument som detta:
{ "_id" : 2, "name" : "Wag", "specs" : { "height" : 50, "weight" : 5, "color" : { "eyes" : "brown", "coat" : "black" } } }
Det här är vad som händer när vi använder $objectToArray
till det dokumentet:
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 det här fallet konverteras dokumentet på toppnivån till k
/v
format, men det inbäddade dokumentet förblir detsamma som i originaldokumentet.
Fel typ
Argumentet som tillhandahålls till $objectToArray
kan vara vilket giltigt uttryck så länge det löser sig till ett dokumentobjekt.
Om argumentet inte löser sig till ett dokumentobjekt uppstår ett fel.
Anta att vi har följande dokument:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
specs
fältet innehåller en sträng.
Det här är vad som händer när vi använder $objectToArray
till det dokumentet:
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 felet säger kräver $objectToArray requires a document input
.
Nullvärden
Tillhandahåller null
resulterar i null
.
Anta att vi har följande dokument:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
Och vi tillämpar $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Resultat:
{ "result" : null }
Fält saknas
Om fältet saknas är resultatet null
.
Anta att vi har följande dokument:
{ "_id" : 5, "name" : "Fetch" }
Och vi tillämpar $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Resultat:
{ "result" : null }