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
k
veld bevat de veldnaam in het originele document. - De
v
veld 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 : [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
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 }