YAM
YAM

Reputation: 494

find the document from sub array?

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

Answers (2)

Sede
Sede

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

gnerkus
gnerkus

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

Related Questions