何时在mongodb中使用$和查询

时间:2012-09-18 13:28:08

标签: mongodb

有人可以告诉我这两个查询之间的区别吗?

db.foo.find({ $and: [{a: 1}, {a: {$gt: 5}}]})

db.foo.find({a:1, a:{$gt:5}})

EDIT 好吧,让我稍微改变一下这个问题。假设以下

dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })
dev(mongod-2.2.0)>db.foo.insert({UserID: 1, Status:'unread' })

我想查找用户ID的所有未读消息1.我是否这样做

db.foo.find({UserID:1, Status:'unread'})

或者

db.foo.find({$and: [{UserID:1},{Status:'unread']})

2 个答案:

答案 0 :(得分:1)

使用$and查询时会考虑这两个条件。如果没有$and,则只会在查询中考虑a的最后一个规范。这似乎也发生在mongo shell的插入中。

在您编辑的问题中,我肯定会使用db.foo.find({UserID:1, Status:'unread'})

以下示例:

> db.sotest.insert({a : 1})
> db.sotest.insert({a : 2})
> db.sotest.insert({a : 6})
> db.sotest.insert({a : 7})
> db.sotest.insert({a : [1, 7]})
> db.sotest.find()
{ "_id" : ObjectId("50587c0164433af6a99c988f"), "a" : 1 }
{ "_id" : ObjectId("50587c0564433af6a99c9890"), "a" : 2 }
{ "_id" : ObjectId("50587c0d64433af6a99c9891"), "a" : 6 }
{ "_id" : ObjectId("50587c1064433af6a99c9892"), "a" : 7 }
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] }
> db.sotest.find({a:1, a:{$gt:5}})
{ "_id" : ObjectId("50587c0d64433af6a99c9891"), "a" : 6 }
{ "_id" : ObjectId("50587c1064433af6a99c9892"), "a" : 7 }
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] }
> db.sotest.find({a:{$gt:5}, a:1})
{ "_id" : ObjectId("50587c0164433af6a99c988f"), "a" : 1 }
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] }
> db.sotest.find({$and : [{a:{$gt:5}}, {a:1}]})
{ "_id" : ObjectId("50587c1f64433af6a99c9893"), "a" : [ 1, 7 ] }
> 

答案 1 :(得分:0)

第二个无效,因为您不能拥有两个具有相同名称a的属性的对象。第一个是有效的,所以这就是差异。

修改

在您更新的问题中,您肯定想要使用:

db.foo.find({UserID:1, Status:'read'});

因为它是更自然的语法。