No creo que eso haya cambiado. Al marcar $ ne, el valor se verifica en todos los documentos, incluidos los que no contienen el campo, pero $ ne: nulo aún no coincidirá con un documento que no contenga el campo ya que el valor del campo sigue siendo nulo, a pesar de que el campo no existe en ese documento.
Tim Gautier
2
¿Cómo se compara el segundo documento?
BT
1
@River Lo comprobé cuando escribí esto hace 3 años y, para asegurarme, acabo de instalar Mongo y lo probé nuevamente. Todavía funciona de la misma manera, la respuesta es correcta. La segunda a la última consulta devuelve solo el primer documento.
Tim Gautier el
1
Los ejemplos dados hacen que sea realmente comprensible cómo usar esto. :-)
mycollection : coloca el nombre de tu colección deseada
nombre del campo : colocar el nombre del campo deseado
Explicación:
$ existe : cuando es verdadero, $ existe coincide con los documentos que contienen el campo, incluidos los documentos donde el valor del campo es nulo. Si es falso, la consulta solo devuelve los documentos que no contienen el campo.
$ ne selecciona los documentos donde el valor del campo no es igual al valor especificado. Esto incluye documentos que no contienen el campo.
Entonces, en su caso proporcionado, la consulta siguiente devolverá todos los documentos con el campo imageurl y no tiene un valor nulo:
Puede verificar el tipo de atributo requerido, devolverá todos los documentos que su field_name consultado contiene un valor porque está verificando el tipo del archivo, de lo contrario, si es nulo, la condición de tipo no coincide, por lo que no se devolverá nada.
Nota : si field_name tiene una cadena vacía que significa "", se devolverá. Es el mismo comportamiento para
¿Es este un documento Json válido? Dos propiedades con el mismo nombre en el documento de consulta. No estoy seguro de cómo construiría eso en la memoria si fuera necesario.
BrentR
4
En un caso ideal, le gustaría probar los tres valores , nulo , "" o vacío (el campo no existe en el registro)
Una alternativa que no se ha mencionado, pero que puede ser una opción más eficiente para algunos (no funcionará con entradas NULL) es usar un índice disperso (las entradas en el índice solo existen cuando hay algo en el campo). Aquí hay un conjunto de datos de muestra:
Ahora, siempre existe la posibilidad (y en particular con un pequeño conjunto de datos como mi muestra) de que, en lugar de usar un índice, MongoDB use un escaneo de tabla, incluso para una posible consulta de índice cubierta. Resulta que eso me da una manera fácil de ilustrar la diferencia aquí:
Y está el resultado que estábamos buscando: solo se devuelven los documentos con el campo poblado. Esto también solo usa el índice (es decir, es una consulta de índice cubierta), por lo que solo el índice debe estar en la memoria para devolver los resultados.
Este es un caso de uso especializado y no se puede usar en general (ver otras respuestas para esas opciones). En particular, debe tenerse en cuenta que, tal como están las cosas, no puede usar count()de esta manera (para mi ejemplo, devolverá 6, no 4), por lo que solo debe usar cuando sea apropiado.
El problema con esto es que asume que el campo realmente nunca persistió, pero el OP parece indicar (desde el título) que podría existir, pero se establece en nulo explícitamente.
@dorvak exactamente, por eso eso no satisfará el caso de uso en la pregunta.
kilianc
Esta respuesta es incorrecta debido a $existslos controles de la llave "IMAGE URL"y no tiene en cuenta que el valor de ( null) y se volverá un documento con "IMAGE URL" : null.
{ field : {$ne : null} }
verificación para documentos no nulos.mongodb.org/manual/reference/operator/query/neRespuestas:
Esto devolverá todos los documentos con una clave llamada "URL DE IMAGEN", pero aún pueden tener un valor nulo.
Esto devolverá todos los documentos con una clave llamada "URL de IMAGEN" y un valor no nulo.
Además, según los documentos, $ existe actualmente no puede usar un índice, pero $ ne sí.
Editar: Agregar algunos ejemplos debido al interés en esta respuesta
Dados estos insertos:
Esto devolverá los tres documentos:
Esto devolverá solo el primer y el segundo documento:
Esto devolverá solo el primer documento:
Esto devolverá solo el segundo y tercer documento:
fuente
$ne
incluye documentos que no contienen el campo . ¿Ha cambiado esto desde que publicaste la respuesta? docs.mongodb.org/manual/reference/operator/query/neUn trazador de líneas es el mejor:
Aquí,
mycollection : coloca el nombre de tu colección deseada
nombre del campo : colocar el nombre del campo deseado
Explicación:
$ existe : cuando es verdadero, $ existe coincide con los documentos que contienen el campo, incluidos los documentos donde el valor del campo es nulo. Si es falso, la consulta solo devuelve los documentos que no contienen el campo.
$ ne selecciona los documentos donde el valor del campo no es igual al valor especificado. Esto incluye documentos que no contienen el campo.
Entonces, en su caso proporcionado, la consulta siguiente devolverá todos los documentos con el campo imageurl y no tiene un valor nulo:
fuente
$exists: true
Es redundante,$ne: null
es suficiente.$exists: true
devuelvenull
valores también. Tiene que haber ambos$exists: true
y$ne: null
. NO es redundante.En pymongo puedes usar:
Porque pymongo representa a mongo "nulo" como python "Ninguno".
fuente
buscar documentos que contienen este nombre_archivo incluso si es nulo.
Mi propuesta:
Puede verificar el tipo de atributo requerido, devolverá todos los documentos que su field_name consultado contiene un valor porque está verificando el tipo del archivo, de lo contrario, si es nulo, la condición de tipo no coincide, por lo que no se devolverá nada.
Nota : si field_name tiene una cadena vacía que significa "", se devolverá. Es el mismo comportamiento para
Validación adicional:
Bien, así que aún no hemos terminado, necesitamos una condición adicional.
O
Referencia
fuente
Esta consulta funcionó para nosotros (consulta ejecutada desde la brújula MongoDB ):
fuente
fuente
En un caso ideal, le gustaría probar los tres valores , nulo , "" o vacío (el campo no existe en el registro)
Puedes hacer lo siguiente.
fuente
Una alternativa que no se ha mencionado, pero que puede ser una opción más eficiente para algunos (no funcionará con entradas NULL) es usar un índice disperso (las entradas en el índice solo existen cuando hay algo en el campo). Aquí hay un conjunto de datos de muestra:
Ahora, cree el índice disperso en el campo imageUrl:
Ahora, siempre existe la posibilidad (y en particular con un pequeño conjunto de datos como mi muestra) de que, en lugar de usar un índice, MongoDB use un escaneo de tabla, incluso para una posible consulta de índice cubierta. Resulta que eso me da una manera fácil de ilustrar la diferencia aquí:
OK, entonces los documentos adicionales sin no
imageUrl
se devuelven, solo están vacíos, no es lo que queríamos. Solo para confirmar por qué, explique:Entonces, sí, a
BasicCursor
es igual a un escaneo de tabla, no usó el índice. Forcemos la consulta para usar nuestro índice disperso con unhint()
:Y está el resultado que estábamos buscando: solo se devuelven los documentos con el campo poblado. Esto también solo usa el índice (es decir, es una consulta de índice cubierta), por lo que solo el índice debe estar en la memoria para devolver los resultados.
Este es un caso de uso especializado y no se puede usar en general (ver otras respuestas para esas opciones). En particular, debe tenerse en cuenta que, tal como están las cosas, no puede usar
count()
de esta manera (para mi ejemplo, devolverá 6, no 4), por lo que solo debe usar cuando sea apropiado.fuente
La forma más simple de verificar la existencia de la columna en mongo compass es:
fuente
la consulta será
devolverá todos los documentos que tengan "URL DE IMAGEN" como clave ...........
fuente
$exists
los controles de la llave"IMAGE URL"
y no tiene en cuenta que el valor de (null
) y se volverá un documento con"IMAGE URL" : null
.