2016-05-09 12 views
2

私は次の構造の文書を持っています:{_id: 'fkwjefioew', genres: [{_id: 'fewkjfewf', 'name': "Shooter"}, {...}, ...]} mongoの$ inを使って、渡されたパラメータのジャンル名を持つ文書があるかどうかを調べることができる必要があります。たとえば、 "Shooter"のパラメータをクエリに渡した場合、そのドキュメント内のオブジェクトの配列の1つが "Shooter"という名前のすべてのドキュメントが必要になります。これを達成する最も簡単な方法は何でしょうか?ありがとう!Mongo配列内のネストされたフィールドを照会します。

答えて

1

これには$elemMatchを使用します。

{"genres": { "$elemMatch" : {"name": "Shooter"} } } 
// or 
{"genres": { "$elemMatch" : {"name": { "$in": ["Shooter"] } } } } 

https://docs.mongodb.com/manual/reference/operator/query/elemMatch/

また、MongoDBのドット表記を使用することができ、それはあなたのようなかなり多くの仕事がexceptなります:

{"genres.name": "Shooter"} 
// or 
{"genres.name": { "$in": ["Shooter"]}} 

のMongoDBはケースgenresでこれを解釈する方法を知っている配列であります。 genresプロパティが配列でない場合は、nameプロパティにも一致するため、ドット表記クエリはわずかにあいまいです。たとえば、このドキュメントは一致します:あなたは、インデックスgenres配列とインデックス内のnameプロパティが検索に使用されることができ、すべてのケースで

{"genres": { "name": "Shooter" } } 

を。

db.collection.createIndex({'genres.name': 1}) 

https://docs.mongodb.com/manual/reference/glossary/#term-dot-notation

https://docs.mongodb.com/manual/reference/operator/query/in/

+2

この答えは、この特定のケースのために右である、しかし、あなたは、同時に複数のフィールドを照会しようとする場合は、予期しない動作を得るかもしれないことに注意してください。あなたがそれをしているなら、$ elemMatchがこの答えに記載された理由のために好まれます:https://stackoverflow.com/questions/18335248/dot-notation-vs-elemmatch –

+1

@AlexanderKuzminアレクサンダーを指摘するためのThx、私は答えを増やしましたあなたのフィードバックを反映させます。 –

関連する問題