2016-01-16 2 views
2

У меня есть коллекция с документами, которые выглядят так:найти документ из поддиапазона?

"awards" : { 
    "oscars" : [ 
     {"award": "bestAnimatedFeature", "result": "won"}, 
     {"award": "bestMusic", "result": "won"}, 
     {"award": "bestPicture", "result": "nominated"}, 
     {"award": "bestSoundEditing", "result": "nominated"}, 
     {"award": "bestScreenplay", "result": "nominated"} 
    ], 
    "wins" : 56, 
    "nominations" : 86, 
    "text" : "Won 2 Oscars. Another 56 wins and 86 nominations." 
} 

Какой запрос документ будет мы используем в команде find(), чтобы вернуть все фильмы в my_collection коллекции, либо выиграл или были номинированы на лучшую фотографию?

ответ

5

Вы должны использовать dot notation, чтобы указать точное совпадение на встроенном документе и использовать оператор $in выбрать те документы, которые выигранные или были номинированы на лучшую картину

Вы не должны использовать оператор $or здесь, потому что он будет выполнять Collectio n сканировать, если не все предложения поддерживаются индексами, как упоминание в documentation.

db.my_collection.find({ 
    'awards.oscars.award': 'bestPicture', 
    'awards.oscars.result': { '$in': [ 'won', 'nominated' ] } 
}) 
1

Согласно MongoDB Query documentation, вы можете сопоставить поле во вложенном документе в массиве путем конкатенации его имя к имени массива, как так:

db.my_collection.find(
    { 
    'awards.oscars.award': 'bestPicture', 
    $or: [ 
     { 'awards.oscars.result': 'won' }, 
     { 'awards.oscars.result': 'nominated' } 
    ] 
    } 
)