En MongoDB, el $objectToArray
El operador de canalización de agregación convierte un documento en una matriz.
La matriz producida por $objectToArray
contiene un elemento para cada par de campo/valor en el documento original. Cada elemento es un documento que contiene un k
campo y una v
campo:
- El
k
campo contiene el nombre del campo en el documento original. - El
v
campo contiene el valor del campo en el documento original.
Ejemplo
Supongamos que tenemos una colección llamada dogs
con el siguiente documento:
{ "_id" : 1, "name" : "Fetch", "specs" : { "height" : 400, "weight" : 55, "color" : "brown" } }
Podemos usar el $objectToArray
operador para devolver las specs
campo como una matriz:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Resultado:
{ "result" : [ { "k" : "height", "v" : 400 }, { "k" : "weight", "v" : 55 }, { "k" : "color", "v" : "brown" } ] }
Documentos anidados
El $objectToArray
El operador solo se aplica al campo de nivel superior. No se aplica recursivamente a ningún documento incrustado.
Supongamos que tenemos un documento como este:
{ "_id" : 2, "name" : "Wag", "specs" : { "height" : 50, "weight" : 5, "color" : { "eyes" : "brown", "coat" : "black" } } }
Esto es lo que sucede cuando aplicamos $objectToArray
a ese documento:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
).pretty()
Resultado:
{ "result" : [ { "k" : "height", "v" : 50 }, { "k" : "weight", "v" : 5 }, { "k" : "color", "v" : { "eyes" : "brown", "coat" : "black" } } ] }
En este caso, el documento de nivel superior se convierte al k
/v
formato, pero el documento incrustado sigue siendo el mismo que en el documento original.
Tipo incorrecto
El argumento proporcionado a $objectToArray
puede ser cualquier expresión válida siempre que se resuelva en un objeto de documento.
Si el argumento no se resuelve en un objeto de documento, se produce un error.
Supongamos que tenemos el siguiente documento:
{ "_id" : 3, "name" : "Fetch", "specs" : "None" }
Las specs
el campo contiene una cadena.
Esto es lo que sucede cuando aplicamos $objectToArray
a ese documento:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Resultado:
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
Como indica el error, $objectToArray requires a document input
.
Valores nulos
Proporcionar null
da como resultado null
.
Supongamos que tenemos el siguiente documento:
{ "_id" : 4, "name" : "Fetch", "specs" : null }
Y aplicamos $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Resultado:
{ "result" : null }
Campos faltantes
Si falta el campo, el resultado es null
.
Supongamos que tenemos el siguiente documento:
{ "_id" : 5, "name" : "Fetch" }
Y aplicamos $objectToArray
:
db.dogs.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{ $project: {
_id: 0,
result: { $objectToArray: "$specs" } }
}
]
)
Resultado:
{ "result" : null }