¿Cómo consulto un objeto frente a una matriz de objetos en un documento?
Necesito seleccionar todos los documentos que son como Dataset 2.
Conjunto de datos 1:
{ 'firstname' : 'John', 'lastname': 'Smith', 'assistance': [ {'type': 'Food', 'amount': 20} ] }Conjunto de datos 2:
{ 'firstname' : 'John', 'lastname': 'Smith', 'assistance': { 'type': 'Food', 'amount': 20 } }puede usar $type , $type no funcionará para dataset1, la razón es que no verifica si el campo es una matriz o no, lo que verifica es que el campo contiene una matriz o no.
Pero si está buscando el conjunto de datos 2, puede usar $type para el objeto
db.whatever.find( { "assistance" : { $type : 3 } } );o
db.whatever.find( { "assistance" : { $type : "object" } } );MongoDB almacena datos en formato BSON .
BSON significa Binario JSON .
BSON admite varios tipos de datos para valores en documentos.
Según la documentación de MongoDB
$type selecciona los documentos donde el valor del campo es una instancia del tipo BSON especificado.
Según los documentos antes mencionados
Conjunto de datos 1: el tipo de datos del campo de asistencia es una matriz.
Dataset2: el tipo de datos del campo de asistencia es un objeto.
Para recuperar solo los documentos que contienen la clave de asistencia que tiene un objeto como tipo de datos, intente ejecutar la siguiente consulta en el shell de MongoDB.
db.colección.find({asistencia:{$tipo:3}})
Para obtener una descripción más detallada de los tipos de BSON, consulte la documentación que se menciona en la siguiente URL
db.foo.find( { "assistance" : { $type : 3 } } ); // 3 is bson type for objectdevolverá tanto los documentos como
db.foo.find( { "assistance" : { $type : 4 } } ); // 4 is bson type for objectno devolverá ninguno de los dos documentos.
Esto se debe a que en mongodb, cuando se consulta una matriz, los elementos de la matriz se verifican en la matriz completa.
Puede eliminar todos los elementos donde la asistencia es de tipo matriz:
db.foo.find({"assistance.0" : {$exists : false}})