2016-05-09 3 views
2

У меня есть документ со следующей структурой: {_id: 'fkwjefioew', genres: [{_id: 'fewkjfewf', 'name': "Shooter"}, {...}, ...]} Мне нужно иметь возможность запрашивать с помощью mongo's $ in, чтобы узнать, имеет ли документ имя жанра переданного параметра. Например, если я передал запрос «Shooter» в запрос, мне нужны все документы, в которых один из объектов внутри этого документа генерирует массив, имеет имя «Shooter». Каким будет самый простой способ достичь этого? Благодаря!Mongo Запросить вложенное поле внутри массива.

ответ

1

Для этого вам необходимо использовать $elemMatch.

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

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

Вы также можете использовать MongoDB точечную нотацию, и это будет очень много работы, как вы бы за исключением:

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

MongoDB знает, как интерпретировать это в случае genres является массивом , Просто имейте в виду, что запрос нотации точки немного неоднозначен, так как он также будет соответствовать свойству name в случае, если свойство genres не является массивом. Например, этот документ будет соответствовать:

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

Во всех случаях вы можете индексировать name свойство в genres массива и индекс будет использоваться для поиска.

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

@ АлександрКузьмин Thx за то, что указал, что Александр, я добавил ответ чтобы отразить ваши отзывы. –

Смежные вопросы