Gibrán
Gibrán

Reputation: 261

How to query an object in an array embedded in mongodb?

I am currently working on an application that takes control of Projects, which have Meetings and that these meetings have Participants.

I want to consult a Participant by his nomina field.

Structure for a project document object:

 {
       "id":"5c1b0616a0441f27f022bfdc",
       "name":"Project Test",
       "area":"Area",
       "date":"2019-01-01",
       "meetings":[
          {
             "id":"5c1b073d445707834699ce97",
             "objetive":"Objetive",
             "fecha":"2019-01-01",
             "participants":[
                {
                   "nomina":1,
                   "name":"Person 1",
                   "role":"Rol1",
                   "area":"area1",
                   "signature":null
                },
                {
                   "nomina":2,
                   "name":"Person 2",
                   "role":"rol 2",
                   "area":"área 2",
                   "signature":null
                }
             ]
          }
       ]
    }

Expected behavior

I want to consult a Participant by nomina field knowing the id of the Project and also knowing the id of the Meeting.

Expected output

Having:

It's expected that the query will return me:

{    
"nomina":1,             
"name":"Person 1",
"role":"Rol1",
"area":"area1",
"signature":null
}

Upvotes: 1

Views: 58

Answers (1)

Babak
Babak

Reputation: 613

For not so huge number of meetings in every document if you want to get the exact document stated, you can do this pipeline, it is straight forward:

db.collection.aggregate(
    [
       {
            $match: {
              id:"5c1b0616a0441f27f022bfdc"             
            }
        },          {
            $unwind: {
                path : "$meetings"
            }
        },
        {
            $unwind: {
                path : "$meetings.participants"
            }
        },
        {
            $match: {
              "meetings.id":"5c1b073d445707834699ce97",
              "meetings.participants.nomina":1

            }
        },
        {
            $replaceRoot: {
                newRoot: "$meetings.participants"
            }
        }
    ]);

If you would have over thousands of elements in meetings then I'd suggest adding another match to meetings or grouping meetings and project IDs. But if you just want to get the document containing what you want it is just a simple find query:

db.collection.find({id:"5c1b0616a0441f27f022bfdc","meetings.id":"5c1b073d445707834699ce97","meetings.participants.nomina":1 });

Upvotes: 1

Related Questions