MongoDB 不等于

我试图在 MongoDB 中显示一个查询,其中文本字段不是“(空白)

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

然而我得到的错误 invalid use of $not

我已经查看了文档,但是它们使用的示例都是针对复杂情况的(使用 regexp 和 $not否定另一个操作符)。

我要怎么做我想做的那件简单的事?

151353 次浏览

使用 $ne—— $not后面应该跟标准操作符:

$ne的一个例子,它代表不相等:

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

现在是 $not,它接受谓词($ne)并否定它($not) :

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

使用 $ne代替 $not

Http://docs.mongodb.org/manual/reference/operator/ne/#op._s_ne

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

如果你想做多个 $ne然后做

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

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()} });

来自 Mongo docs:

$not操作符只影响其他操作符,不能进行检查 字段和文档。因此,使用 $not运算符 逻辑析取和 $ne运算符来测试 直接领域。

因为您直接测试字段,所以在这里使用 $ne是正确的操作符。

Edit:

您希望使用 $not的情况是:

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

这将选择下列所有文件:

  • Price 字段值小于或等于1.99或 price
  • 字段不存在

如果数组中有一个 null,并且您想要避免它:

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