Jordi
Jordi

Reputation: 23187

mongodb query: nested elemMatch

Currently, that's my current document:

{
    _id: 'd283015f-91e9-4404-9202-093c28d6a931',
    referencedGeneralPractitioner: [
      {
        resourceType: 'practitioner',
        cachedIdentifier: [
          {
            system: { value: 'urn:oid:1.3.6.1.4.1.19126.3' },
            value: { value: '14277399B' }
          }
        ]
      }
    ]
  }

Here, there's two nested objects arrays: referencedGeneralPractitioner[{cachedIdentifier[{}]}].

Currently, I'm getting results using this query:

{
   "referencedGeneralPractitioner":{
      "$elemMatch":{
         "cachedIdentifier.value.value":"14277399B",
         "cachedIdentifier.system.value":"urn:oid:1.3.6.1.4.1.19126.3"
      }
   }
}

It's getting my desired document, but I don't quite figure out if above query is which I'm really looking for.

I mean, I'm only applying $elemMatch on referencedGeneralPractitioner field array.

  1. Is it really enought?
  2. Should I add a nested $elemMatch on cachedIdentifier?

Any ideas?

Upvotes: 1

Views: 1059

Answers (1)

R2D2
R2D2

Reputation: 10697

It looks like you need to query it like this:

  db.collection.find({
     "referencedGeneralPractitioner.cachedIdentifier": {
         "$elemMatch": {
                        "value.value": "14277399B",
                        "system.value": "urn:oid:1.3.6.1.4.1.19126.3"
                       }
        }
    })

playground

This is in case you need to find the full document having $and of both values in same element in any of the elements in the nested array , if you need to extract specific element you will need to $filter

if you need to search also based on element in the 1st array level then you need to modify as follow:

 { 
   "referencedGeneralPractitioner": {
     "$elemMatch": { 
       resourceType: 'practitioner',
        "cachedIdentifier": {
                "$elemMatch": {
                               "value.value": 1,
                               "system.value":2
                              }
                            }
                   }
           }
   }

This will give you all full documents where at same time there is resouceType:"practitioner" and { value.value:3 and system.value: 2 }

Also is important to stress that this will not gona work correctly!:

       {
     "referencedGeneralPractitioner":{
        "$elemMatch":{
     "cachedIdentifier.value.value":"14277399B",
    "cachedIdentifier.system.value":"urn:oid:1.3.6.1.4.1.19126.3"
     }
   }
 }

Since it will match false positives based on any single value in the nested elements like: wrong playground

Upvotes: 2

Related Questions