user2573690
user2573690

Reputation: 5973

How to get count of elements in document array - MongoDB?

I have the following MongoDB collection (JSON):

{
    "_id" : ObjectId("570185458351bbac27bc9a20"),
    "email" : "[email protected]",
    "applicants" : [
            {
                    "id" : "570724e4ae4f8a5026156999",
                    "email" : "[email protected]",
            },
            {
                    "id" : "570724e4ae4f8a5026156333",
                    "email" : "[email protected]",
            },
            {
                    "id" : "570724e4ae4f8a5026156111",
                    "email" : "[email protected]",
            },
            {
                    "id" : "570724e4ae4f8a5026156222",
                    "email" : "[email protected]",
            }
    ],
}, 
{
    "_id" : ObjectId("570185458351bbac27bc9a20"),
    "email" : "[email protected]",
    "applicants" : [
            {
                    "id" : "570724e4ae4f8a5026156555",
                    "email" : "[email protected]",
            },
            {
                    "id" : "570724e4ae4f8a5026156666",
                    "email" : "[email protected]",
            },
    ],
},
{
    "_id" : ObjectId("570185458351bbac27bc9a20"),
    "email" : "[email protected]",
    "applicants" : [
            {
                    "id" : "570724e4ae4f8a5026156555",
                    "email" : "[email protected]",
            },
            {
                    "id" : "570724e4ae4f8a5026156666",
                    "email" : "[email protected]",
            },
    ],
 }

I would like to get the count of the elements in all arrays of the of the document where the email = [email protected]. How can I go about getting that count?

I am using the following to get the number of documents with email [email protected] using this:

   collection.count({"email" : tmpEmail},    function (err, count) {
      res.json(count);
      console.log("Number: " + count);
    }); 

How can I go ahead and count the number of elements in all applicant arrays for the documents where the email is [email protected]? The could for the example above would be: 6.

EDIT:

As per one of the answers I modified my query to the following:

Answer 1:

collection.aggregate(
        {$match: {"email": req.user.username, "status" : "true"}},
        {$unwind: "$applicants"},
        {$group: {_id:null, count: {$sum :1}},  function (err, count) {
            res.json(count);
            console.log("Number of New Applicants: " + count);
            }
        });

Answer 2:

collection.aggregate(
        [{$match:{"email" : req.user.username, "status" : "true"}}, 
         {$project:{_id:0, email:1, totalApplicants:{$size:"$applicants"}}},  
         {$group:{_id:"$employer", count:{$sum:"$totalApplicants"}}}],
         function (err, count){
             res.json(count);
             console.log("Number of New Applicants: " + count);
         });

Upvotes: 2

Views: 5524

Answers (2)

Sarath Nair
Sarath Nair

Reputation: 2868

You can use an aggregate query instead:

collection.aggregate(
    [{$match: {"email": req.user.username, "status" : "true"}},
    {$unwind: "$applicants"},
    {$group: {_id:null, count: {$sum :1}}}],  function (err, result) {
        console.log(result);
        console.log("Number of New Applicants: " + result[0].count);
        if(result.length > 0)
            res.json(result[0]);
        else
            res.json({count:0});
        }
    });

This will result you in one document where count will have your required result

Upvotes: 4

Atish
Atish

Reputation: 4425

This may require to write a aggregation since you need to count the size of applicants array grouped by email:

Here is the equivalent mongodb query that returns the expected email with count:

db.yourCollection.aggregate(

  [{$match:{"email" : "[email protected]"}}, 

  {$project:{_id:0, email:1,totalEmails:{$size:"$applicants"}}},  

  {$group:{_id:"$email", count:{$sum:"$totalEmails"}}}])

This returns { "_id" : "[email protected]", "count" : 6 }

You may need to change this according to your code.

Upvotes: 2

Related Questions