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?

Akshat
fuente

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" : "" }
Om nom nom
fuente
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"]}})
Martin Konecny
fuente
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
nilsi
fuente
3

Si hay un nullen una matriz y desea evitarlo:

db.test.find({"contain" : {$ne :[] }}).pretty()
usuario3806115
fuente
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()} }); 
Andy
fuente