有人可以告诉我这两个查询之间的区别吗?
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']})
答案 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'});
因为它是更自然的语法。