MongoDB no es igual a


102

Estoy tratando de mostrar una consulta en MongoDB donde un campo de texto no es '' (en blanco)

{ 'name' : { $not : '' }}

Sin embargo me sale el error invalid use of $not

Revisé la documentación, pero los ejemplos que usan son para casos complicados (con expresiones regulares y $notnegando otro operador).

¿Cómo haría lo simple que estoy tratando de hacer?

Respuestas:


147

Uso $ne: $notdebe ser seguido por el operador estándar:

Un ejemplo de $ne, que significa no igual:

use test
switched to db test
db.test.insert({author : 'me', post: ""})
db.test.insert({author : 'you', post: "how to query"})
db.test.find({'post': {$ne : ""}})
{ "_id" : ObjectId("4f68b1a7768972d396fe2268"), "author" : "you", "post" : "how to query" }

Y ahora $not, que toma el predicado ( $ne) y lo niega ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }

4
Para los curiosos se $nerefiere a "no iguales".
abraham

1
Esta respuesta tiene un gran número de votos, pero la explicación es muy poco clara. ¿Qué está sucediendo en el ejemplo que tiene tanto $ not como $ ne?
GaTechThomas

Así que en breve $not :{ $nemedios $eq, esto es lo que estaba tratando de decir?
Anu

61

Si quieres hacer varios $ne, hazlo

db.users.find({name : {$nin : ["mary", "dick", "jane"]}})


10

De los documentos de Mongo :

El $notoperador solo afecta a otros operadores y no puede verificar campos y documentos de forma independiente. Entonces, use el $notoperador para disyunciones lógicas y el $neoperador para probar el contenido de los campos directamente.

Dado que está probando el campo directamente, $nees el operador correcto para usar aquí.

Editar:

Una situación en la que le gustaría usar $notes:

db.inventory.find( { price: { $not: { $gt: 1.99 } } } )

Eso seleccionaría todos los documentos donde:

  • El valor del campo de precio es menor o igual a 1,99 o el precio
  • El campo no existe

3

Si hay un nullen una matriz y desea evitarlo:

db.test.find({"contain" : {$ne :[] }}).pretty()

1

Ejemplo de la vida real; buscar todos, pero no el usuario actual:

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
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.