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?

Andrés
fuente

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

jdi
fuente
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 }})
televisores
fuente
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}
])
Anil Tallam
fuente
8

Parece que puedes hacer una sola línea:

{ "sent_at": null }
Jim Horng
fuente
0

También puedes probar esto:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
Vivek Maraina
fuente