29

我正在 Mongo 中尝试一个简单的查询,在 MySQL 中看起来像这样。

select * from emails where bounceCount > sentCount;

到目前为止我有。

db.email.find({ bounceCount : { $gt : sentCount } } );

但我得到这个错误

JS Error: ReferenceError: sentCount is not defined (shell):0

如何在那个 shell 中引用 sentCount?

4

4 回答 4

36

它应该可以解决问题:

db.emails.find({ $expr: { $gt: [ "$bounceCount" , "$sentCount" ] } });

这是我找到它的参考: https ://docs.mongodb.com/manual/reference/operator/query/expr/#op._S_expr

于 2018-04-02T19:05:59.453 回答
24

每个人似乎都在$where不知不觉中提到它:

  • 减缓
  • 不安全(评估)
  • JavaScript,而不是 MongoDB 内部
  • 而且,在 2.4 之前的版本中,单线程和全局锁定

另一种对于大约 99% 的情况会更好的方法是使用聚合框架:

db.col.aggregate([
    {$project: {ab: {$cmp: ['$bounceCount','$sentCount']}}},
    {$match: {ab:{$gt:0}}}
])
于 2013-04-16T18:19:12.270 回答
18

db.so.find("this.bounceCount > this.sentCount")就是你要找的。

相等的:db.so.find({"$where":"this.bounceCount > this.sentCount"})

文档:http ://docs.mongodb.org/manual/reference/operator/where/

外壳输出:

> db.so.insert({bounceCount:1, sentCount:2})
> db.so.insert({bounceCount:5, sentCount:3})
> db.so.insert({bounceCount:5, sentCount:4})
> db.so.insert({bounceCount:5, sentCount:7})
> db.so.insert({bounceCount:9, sentCount:7})

> db.so.find()
{ "_id" : ObjectId("516d7f30675a2a8d659d7594"), "bounceCount" : 1, "sentCount" : 2 }
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 }
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 }
{ "_id" : ObjectId("516d7f3d675a2a8d659d7597"), "bounceCount" : 5, "sentCount" : 7 }
{ "_id" : ObjectId("516d7f40675a2a8d659d7598"), "bounceCount" : 9, "sentCount" : 7 }

> db.so.find({"bounceCount":5})
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 }
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 }
{ "_id" : ObjectId("516d7f3d675a2a8d659d7597"), "bounceCount" : 5, "sentCount" : 7 }

> db.so.find("this.bounceCount > this.sentCount")
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 }
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 }
{ "_id" : ObjectId("516d7f40675a2a8d659d7598"), "bounceCount" : 9, "sentCount" : 7 }
于 2013-04-16T16:45:31.937 回答
1

您可以使用 $where 运算符来执行此操作,这使您可以在查询中使用 Javascript 代码。

对于您的示例,您将执行以下操作:

db.email.find({ $where: "this.bounceCount > this.sentCount" });

有关 $where 运算符的更多详细信息,请参阅 MongoDB 文档页面:http: //docs.mongodb.org/manual/reference/operator/where/#op._S_where

于 2013-04-16T16:46:18.083 回答