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
kchamp contient le nom du champ dans le document d'origine. - Le
vchamp 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 :
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
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 }