2017-07-12 7 views
1

私は以下のように文書構造を持つコレクションを持っている:MongoDBのクエリ構造

db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val.status" : 1}) 

db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val" : { "status" : 1}}) 

:私はこの文書を入手しようとした2つのクエリがあります

"_id": { 
    "userId": "user_id_1" 
}, 
"val": { 
    "status": 1, 
    "otherKey": "otherValue" 
} 

を最初のクエリはドキュメントを返し、2番目のクエリはドキュメントを返しません。 私はユーザーIDの場合と同じようにステータスを一致させたいと思っています。 2人のクエリの違いを教えてもらえますか?

答えて

1

この主張クエリで"val": { "status" : 1}は意味:valオブジェクトはまたでそれを取得するにはotherKeyフィールド

を持っているので、ここでvalはJSONオブジェクトに{"status": 1}

に等しい文書i'tsないケースを返しますこの構文は、使用する必要があります

db.getCollection('my_collection').find(
{ "_id" : { "userId" : "user_id_1"} , 
    "val" : { "status" : 1, "otherKey": "otherValue" }} 
) 
1

OPで説明したように埋め込みドキュメントをクエリしてクエリ(つまり2番目のクエリ)を記述すると、 MongoDBはフィールドの順序を含む埋め込みドキュメントと正確に一致します。

db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val" : { "status" : 1}}) 

あなたはフィールド(すなわち、ステータス及びotherKey)の順序を変更するクエリを記述する場合にMongoDBが埋め込まれた文書を正確に(フィールドの順序を含む、すなわち、同一の一致)に一致するように、あなたが結果を得ることはできません。

db.getCollection('my_collection').find(
{ "_id" : { "userId" : "user_id_1"} , 
    "val" : {"otherKey": "otherValue", "status" : 1 }} 
) 

MongoDBはドット表記(OPで、すなわち、あなたの最初のクエリ)のために動作が異なります。上記のように完全一致は実行されません。それは単にクエリに記載されているフィールドを探します。

ステータスによってクエリ -

db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val.status" : 1}) 

otherKeyによるクエリ -

db.getCollection('my_collection').find({ "_id" : { "userId" : "user_id_1"} , "val.otherKey" : "otherValue"}) 

結論: - ドット表記によって

クエリなら優れています埋め込みドキュメントのすべてのフィールドでクエリする必要はありません。