2

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

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

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

编辑好吧,让我稍微改变一下问题。假设以下

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']})
4

2 回答 2

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 ] }
> 
于 2012-09-18T13:56:38.883 回答
0

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

编辑

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

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

因为它是更自然的语法。

于 2012-09-18T13:53:42.200 回答