Reputation: 494
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?
Upvotes: 3
Views: 2039
Reputation: 61225
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' ] }
} )
Upvotes: 6
Reputation: 12019
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' }
]
}
)
Upvotes: 1