sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $objetoToArray

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 }