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:
kfältet innehåller fältnamnet i originaldokumentet.vfä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 :
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
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 }