2

これら2つのクエリの違いを誰か教えてもらえますか?

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

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

編集 OK、質問を少し変更させてください。次のことを前提とします

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 シェルからの挿入でも発生するようです。

あなたの編集された質問では、私は間違いなく使用します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

の同じ名前を持つ 2 つのプロパティを持つオブジェクトを持つことはできないため、2 番目のものは有効ではありませんa。最初のものは有効なので、それが違いです。

編集

あなたの更新された質問では、間違いなく次のものを使用したいと考えています。

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

それはより自然な構文だからです。

于 2012-09-18T13:53:42.200 に答える