MongoDB: ¿Cómo consultar registros donde el campo es nulo o no está establecido?


106

Tengo un Emaildocumento que tiene un sent_atcampo de fecha:

{
  'sent_at': Date( 1336776254000 )
}

Si Emailno se ha enviado, el sent_atcampo es nulo o inexistente.

Necesito obtener el recuento de todos los enviados / no enviados Emails. Estoy atascado tratando de encontrar la forma correcta de consultar esta información. Creo que esta es la forma correcta de obtener el recuento enviado:

db.emails.count({sent_at: {$ne: null}})

Pero, ¿cómo debo obtener el recuento de los que no se envían?

Respuestas:


170

Si el campo sent_at no está allí cuando no está configurado, entonces:

db.emails.count({sent_at: {$exists: false}})

Si está allí y es nulo, o no está en absoluto:

db.emails.count({sent_at: null})

Consulte aquí para consultar y nulo


16

Si desea contar ÚNICAMENTE los documentos con sent_atdefinido con un valor de null(no cuente los documentos con sent_atno establecido):

db.emails.count({sent_at: { $type: 10 }})

Gracias. Cuando se comprueba si el campo existe pero se establece en nulo, esto es muy útil.
jstice4all

Votado a favor porque cuando se usa findcon simple nullinterpreta valores como 0.0as nully esta solución evita esto
Matthias Herrmann

12

Utilizar:

db.emails.count({sent_at: null})

Que cuenta todos los correos electrónicos cuya propiedad sent_at es nula o no está establecida. La consulta anterior es la misma que la siguiente.

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
])

8

Parece que puedes hacer una sola línea:

{ "sent_at": null }

0

También puedes probar esto:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
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.