I have a collection with documents that look like this:
"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." }
What query document would we use in a find()
command to return all movies in the my_collection
collection that either won or were nominated for best picture?
You need to use the dot notation to specify an exact match on the embedded document and use the $in
operator to select those documents that won or were nominated for best picture
You shouldn't use the $or
operator here because it will perform a collection scan if not all the clauses are supported by indexes as mention in the documentation.
db.my_collection.find({ 'awards.oscars.award': 'bestPicture', 'awards.oscars.result': { '$in': [ 'won', 'nominated' ] } } )
According to the MongoDB Query documentation, you can match a field in an embedded document within an array by concatenating its name to the name of the array like so:
db.my_collection.find( { 'awards.oscars.award': 'bestPicture', $or: [ { 'awards.oscars.result': 'won' }, { 'awards.oscars.result': 'nominated' } ] } )