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?
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" : "" }
If you want to do multiple $ne
then do
db.users.find({name : {$nin : ["mary", "dick", "jane"]}})
Use $ne
instead of $not
http://docs.mongodb.org/manual/reference/operator/ne/#op._S_ne
db.collections.find({"name": {$ne: ""}});
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
If there is a null
in an array and you want to avoid it:
db.test.find({"contain" : {$ne :[] }}).pretty()
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()} });