web-dev-qa-db-fra.com

MongoDB pas égal à

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 parcouru la documentation, mais les exemples utilisés sont destinés à des cas compliqués (avec regexp et $not pour annuler un autre opérateur).

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

77
Akshat

Utilisez $ne - $not devrait être suivi par l'opérateur standard:

Un exemple pour $ne, qui signifie non é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 le prédicat ($ne) et l’annule ($not):

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

Si vous voulez faire plusieurs $ne puis faites

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

Utilisez $ne au lieu de $not

http://docs.mongodb.org/manual/reference/operator/ne/#op._S_ne

db.collections.find({"name": {$ne: ""}});
29
Kemal Fadillah

De la dongo Mongo :

L'opérateur $not n'affecte que les autres opérateurs et ne peut pas vérifier champs et documents indépendamment. Utilisez donc l'opérateur $not pour les disjonctions logiques et l'opérateur $ne pour tester le contenu de champs directement.

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

Modifier:

Une situation dans laquelle vous souhaitez utiliser $not est la suivante:

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
4
nilsi

S'il existe une null dans un tableau et que vous souhaitez l'éviter:

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

Exemple de la vie réelle; trouver tout sauf l'utilisateur actuel:

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