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?

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}}
]})

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.