MongoDB not equal to

Mongodb

Mongodb Problem Overview


I'm trying to display a query in MongoDB where a text field is not '' (blank)

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

However I get the error invalid use of $not

I've looked over the documentation but the examples they use are for complicated cases (with regexp and $not negating another operator).

How would I do the simple thing I'm trying to do?

Mongodb Solutions


Solution 1 - Mongodb

Use $ne -- $not should be followed by the standard operator:

An examples for $ne, which stands for not equal:

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

And now $not, which takes in predicate ($ne) and negates it ($not):

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

Solution 2 - Mongodb

If you want to do multiple $ne then do

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

Solution 3 - Mongodb

Use $ne instead of $not

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

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

Solution 4 - Mongodb

From the Mongo docs:

> The $not operator only affects other operators and cannot check > fields and documents independently. So, use the $not operator for > logical disjunctions and the $ne operator to test the contents of > fields directly.

Since you are testing the field directly $ne is the right operator to use here.

Edit:

A situation where you would like to use $not is:

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

That would select all documents where:

  • The price field value is less than or equal to 1.99 or the price
  • Field does not exist

Solution 5 - Mongodb

If there is a null in an array and you want to avoid it:

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

Solution 6 - Mongodb

Real life example; find all but not current user:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTarangView Question on Stackoverflow
Solution 1 - Mongodbom-nom-nomView Answer on Stackoverflow
Solution 2 - MongodbMartin KonecnyView Answer on Stackoverflow
Solution 3 - MongodbKemal FadillahView Answer on Stackoverflow
Solution 4 - MongodbnilsiView Answer on Stackoverflow
Solution 5 - Mongodbuser3806115View Answer on Stackoverflow
Solution 6 - MongodbAndyView Answer on Stackoverflow