Dans MongoDB, le $objectToArray
L'opérateur de pipeline d'agrégation convertit un document en tableau.
Le tableau produit par $objectToArray
contient un élément pour chaque paire champ/valeur du document d'origine. Chaque élément est un document qui contient un k
champ et un v
champ :
- Le
k
champ contient le nom du champ dans le document d'origine. - Le
v
champ contient la valeur du champ dans le document d'origine.
Exemple
Supposons que nous ayons une collection appelée dogs
avec le document suivant :
{ "_id" : 1, "name" : "Fetch", "specs" : { "height" : 400, "weight" : 55, "color" : "brown" } }
Nous pouvons utiliser le $objectToArray
opérateur pour renvoyer les specs
champ sous forme de tableau :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Résultat :
{ "result" : [ { "k" : "height", "v" : 400 }, { "k" : "weight", "v" : 55 }, { "k" : "color", "v" : "brown" } ] }
Documents imbriqués
Le $objectToArray
L'opérateur s'applique uniquement au champ de niveau supérieur. Il ne s'applique pas de manière récursive aux documents intégrés.
Supposons que nous ayons un document comme celui-ci :
{ "_id" : 2, "name" : "Wag", "specs" : { "height" : 50, "weight" : 5, "color" : { "eyes" : "brown", "coat" : "black" } } }
Voici ce qui se passe lorsque nous appliquons $objectToArray
à ce document :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Résultat :
{ "result" : [ { "k" : "height", "v" : 50 }, { "k" : "weight", "v" : 5 }, { "k" : "color", "v" : { "eyes" : "brown", "coat" : "black" } } ] }
Dans ce cas, le document de niveau supérieur est converti en k
/v
format, mais le document intégré reste le même que dans le document d'origine.
Mauvais type
L'argument fourni à $objectToArray
peut être n'importe quelle expression valide tant qu'elle se résout en un objet document.
Si l'argument ne se résout pas en un objet document, une erreur se produit.
Supposons que nous ayons le document suivant :
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
Les specs
le champ contient une chaîne.
Voici ce qui se passe lorsque nous appliquons $objectToArray
à ce document :
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Résultat :
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
Comme l'indique l'erreur, $objectToArray requires a document input
.
Valeurs nulles
Fournir null
donne null
.
Supposons que nous ayons le document suivant :
{ "_id" : 4, "name" : "Fetch", "specs" : null }
Et nous appliquons $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Résultat :
{ "result" : null }
Champs manquants
Si le champ est manquant, le résultat est null
.
Supposons que nous ayons le document suivant :
{ "_id" : 5, "name" : "Fetch" }
Et nous appliquons $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Résultat :
{ "result" : null }