cómo consultar objetos secundarios en mongodb

80

Soy nuevo en mongodb y estoy tratando de consultar objetos secundarios. Tengo una colección de estados y cada estado tiene ciudades secundarias. Una de las ciudades tiene una propiedad de nombre que es nula, lo que provoca errores en mi aplicación. ¿Cómo consultaría las colecciones estatales para encontrar ciudades secundarias que tengan un nombre == nulo?

Justin
fuente

Respuestas:

114

Si es exactamente null(en lugar de no establecido):

db.states.find({"cities.name": null})

(pero como señala javierfp, también coincide con documentos que no tienen ninguna matriz de ciudades, supongo que sí).

Si es el caso que la propiedad no está configurada:

db.states.find({"cities.name": {"$exists": false}})

He probado lo anterior con una colección creada con estas dos inserciones:

db.states.insert({"cities": [{name: "New York"}, {name: null}]})
db.states.insert({"cities": [{name: "Austin"}, {color: "blue"}]})

La primera consulta encuentra el primer estado, la segunda consulta encuentra el segundo. Si desea encontrarlos a ambos con una sola consulta, puede realizar una $orconsulta:

db.states.find({"$or": [
  {"cities.name": null}, 
  {"cities.name": {"$exists": false}}
]})
Theo
fuente
cómo puedo obtener todos los objetos secundarios. usando la proyección solo
obtengo
38

Suponiendo que su colección de "estados" es como:

{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] }
{"name" : "France" }

La consulta para encontrar estados con ciudades nulas sería:

db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}});

Es un error común consultar nulos como:

db.states.find({"cities.name" : null});

porque esta consulta devolverá todos los documentos que carecen de la clave (en nuestro ejemplo devolverá España y Francia). Por lo tanto, a menos que esté seguro de que la clave siempre está presente, debe verificar que la clave exista como en la primera consulta.

Javier Ferrero
fuente