In MongoDB is de $objectToArray aggregatiepijplijnoperator converteert een document naar een array.
De array geproduceerd door $objectToArray bevat een element voor elk veld/waarde-paar in het originele document. Elk element is een document dat een k . bevat veld en een v veld:
- De
kveld bevat de veldnaam in het originele document. - De
vveld bevat de waarde van het veld in het originele document.
Voorbeeld
Stel dat we een verzameling hebben met de naam dogs met het volgende document:
{
"_id" : 1,
"name" : "Fetch",
"specs" : {
"height" : 400,
"weight" : 55,
"color" : "brown"
}
}
We kunnen de $objectToArray . gebruiken operator om de specs te retourneren veld als een array:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty() Resultaat:
{
"result" : [
{
"k" : "height",
"v" : 400
},
{
"k" : "weight",
"v" : 55
},
{
"k" : "color",
"v" : "brown"
}
]
} Geneste documenten
De $objectToArray operator is alleen van toepassing op het veld op het hoogste niveau. Het is niet recursief van toepassing op ingesloten documenten.
Stel dat we een document hebben zoals dit:
{
"_id" : 2,
"name" : "Wag",
"specs" : {
"height" : 50,
"weight" : 5,
"color" : {
"eyes" : "brown",
"coat" : "black"
}
}
}
Dit is wat er gebeurt als we $objectToArray toepassen naar dat document:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty() Resultaat:
{
"result" : [
{
"k" : "height",
"v" : 50
},
{
"k" : "weight",
"v" : 5
},
{
"k" : "color",
"v" : {
"eyes" : "brown",
"coat" : "black"
}
}
]
}
In dit geval wordt het document op het hoogste niveau geconverteerd naar de k /v formaat, maar het ingesloten document blijft hetzelfde als in het originele document.
Verkeerd type
Het argument geleverd aan $objectToArray kan elke geldige uitdrukking zijn, zolang deze maar wordt omgezet in een documentobject.
Als het argument niet wordt omgezet in een documentobject, treedt er een fout op.
Stel dat we het volgende document hebben:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
De specs veld bevat een tekenreeks.
Dit is wat er gebeurt als we $objectToArray toepassen naar dat document:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
) Resultaat:
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
Zoals de fout aangeeft, vereist $objectToArray requires a document input .
Null-waarden
null opgeven resulteert in null .
Stel dat we het volgende document hebben:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
En we passen $objectToArray . toe :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
) Resultaat:
{ "result" : null } Ontbrekende velden
Als het veld ontbreekt, is het resultaat null .
Stel dat we het volgende document hebben:
{ "_id" : 5, "name" : "Fetch" }
En we passen $objectToArray . toe :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
) Resultaat:
{ "result" : null }