In MongoDB, il $objectToArray
l'operatore della pipeline di aggregazione converte un documento in una matrice.
L'array prodotto da $objectToArray
contiene un elemento per ogni coppia campo/valore nel documento originale. Ogni elemento è un documento che contiene un k
campo e un v
campo:
- Il
k
campo contiene il nome del campo nel documento originale. - Il
v
campo contiene il valore del campo nel documento originale.
Esempio
Supponiamo di avere una collezione chiamata dogs
con il seguente documento:
{ "_id" : 1, "name" : "Fetch", "specs" : { "height" : 400, "weight" : 55, "color" : "brown" } }
Possiamo usare il $objectToArray
operatore per restituire le specs
campo come matrice:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Risultato:
{ "result" : [ { "k" : "height", "v" : 400 }, { "k" : "weight", "v" : 55 }, { "k" : "color", "v" : "brown" } ] }
Documenti nidificati
Il $objectToArray
l'operatore si applica solo al campo di livello superiore. Non si applica ricorsivamente ad alcun documento incorporato.
Supponiamo di avere un documento come questo:
{ "_id" : 2, "name" : "Wag", "specs" : { "height" : 50, "weight" : 5, "color" : { "eyes" : "brown", "coat" : "black" } } }
Ecco cosa succede quando applichiamo $objectToArray
a quel documento:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Risultato:
{ "result" : [ { "k" : "height", "v" : 50 }, { "k" : "weight", "v" : 5 }, { "k" : "color", "v" : { "eyes" : "brown", "coat" : "black" } } ] }
In questo caso, il documento di livello superiore viene convertito in k
/v
formato, ma il documento incorporato rimane lo stesso del documento originale.
Tipo errato
L'argomento fornito a $objectToArray
può essere qualsiasi espressione valida purché si risolva in un oggetto documento.
Se l'argomento non si risolve in un oggetto documento, si verifica un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
Le specs
il campo contiene una stringa.
Ecco cosa succede quando applichiamo $objectToArray
a quel documento:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Risultato:
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
Come indica l'errore, $objectToArray requires a document input
.
Valori Nulli
Fornendo null
risulta null
.
Supponiamo di avere il seguente documento:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
E applichiamo $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Risultato:
{ "result" : null }
Campi mancanti
Se il campo è mancante, il risultato è null
.
Supponiamo di avere il seguente documento:
{ "_id" : 5, "name" : "Fetch" }
E applichiamo $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Risultato:
{ "result" : null }