2017-12-13 5 views
2

私はmangoコレクションのデータを取得するためのクエリを作成しています。私は2つの異なる方法で同じクエリを作成しています。最初のプロパティの宣言とmongoの最後の場所のクエリ?

作業クエリ:

db.getCollection('routes').find({"routes.routeId": "r1qJo2zWG"}, {routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}) 

ない作業クエリ:

db.getCollection('routes').find({routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}, {"routes.routeId": "r1qJo2zWG"}) 

クエリの作業があるが、最後の/最初の位置にあるように "routes.routeId" としてプロパティ宣言に依存します。

なぜこれがmongodbクエリで起こるか考えてください。

答えて

2

クエリと投影が混在しています。両方のクエリが期待どおりに動作しています。

findメソッドは、クエリと投影の両方を使用します。あなたは、ルート・アレイが持つルートIDを持っているすべての文書を照会している

第1例(有効)

db.getCollection('routes').find({"routes.routeId": "r1qJo2zWG"}, {routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}) 

クエリパート

{"routes.routeId": "r1qJo2zWG"} 

突起部

{routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}} 

値 "r1qJo2zWG"に続いて出力に "r1qJo2zWG"

第2例(無効)

db.getCollection('routes').find({routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}}, {"routes.routeId": "r1qJo2zWG"}) 

クエリパート

{routes : {"$elemMatch": {"routeId": "r1qJo2zWG"}}} 

突起部

のルートID値と一致するルートをルート要素を制限する
{"routes.routeId": "r1qJo2zWG"} 

$elemMatch(query)を使用してすべてのドキュメントを照会しています。ここで、routes配列には値 "r1qJo2zWG"(これは{routes4.routeId ":" r1qJo2zWG "}と同じです)と$elemMatch演算子は単一の条件一致には必要ありません)無効な投影{"routes.routeId": "r1qJo2zWG"}です。

ルートプロビジョニングのすべてのルートID値を表示するには、正しいプロジェクションを使用する場合は{"routes.routeId":1}にする必要があります。

関連する問題