MongoDB n'est pas égal à

102

J'essaie d'afficher une requête dans MongoDB où un champ de texte n'est pas '' (vide)

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

Cependant j'obtiens l'erreur invalid use of $not

J'ai regardé la documentation mais les exemples qu'ils utilisent concernent des cas compliqués (avec regexp et $notannulation d'un autre opérateur).

Comment pourrais-je faire la chose simple que j'essaie de faire?

Akshat
la source

Réponses:

147

Utilisation $ne- $notdoit être suivi par l'opérateur standard:

Un exemple pour $ne, qui signifie pas égal:

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" }

Et maintenant $not, qui prend prédicat ( $ne) et le nie ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }
Om Nom Nom
la source
4
Pour les curieux se $neréfère à «pas égal».
abraham
1
Cette réponse a un grand nombre de voix, mais l'explication est très floue. Que se passe-t-il dans l'exemple qui contient à la fois le $ not et le $ ne?
GaTechThomas
donc en bref $not :{ $nesignifie $eq, c'est ce que vous essayiez de dire?
Anu
61

Si vous voulez faire plusieurs $nepuis faire

db.users.find({name : {$nin : ["mary", "dick", "jane"]}})
Martin Konecny
la source
10

À partir de la documentation Mongo :

L' $notopérateur n'affecte que les autres opérateurs et ne peut pas vérifier les champs et les documents indépendamment. Donc, utilisez l' $notopérateur pour les disjonctions logiques et l' $neopérateur pour tester directement le contenu des champs.

Puisque vous testez directement, le champ $neest le bon opérateur à utiliser ici.

Éditer:

Une situation dans laquelle vous souhaitez utiliser $notest:

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

Cela sélectionnerait tous les documents où:

  • La valeur du champ de prix est inférieure ou égale à 1,99 ou le prix
  • Le champ n'existe pas
nilsi
la source
3

S'il y a un nulldans un tableau et que vous voulez l'éviter:

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

Exemple réel; trouver tous mais pas l'utilisateur actuel:

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
Andy
la source