【问题标题】:How to get count of elements in document array - MongoDB?如何获取文档数组中的元素计数 - MongoDB?
【发布时间】:2016-09-01 00:02:51
【问题描述】:

我有以下 MongoDB 集合 (JSON):

{
    "_id" : ObjectId("570185458351bbac27bc9a20"),
    "email" : "test@gmail.com",
    "applicants" : [
            {
                    "id" : "570724e4ae4f8a5026156999",
                    "email" : "a@gmail.com",
            },
            {
                    "id" : "570724e4ae4f8a5026156333",
                    "email" : "a2@gmail.com",
            },
            {
                    "id" : "570724e4ae4f8a5026156111",
                    "email" : "a3@gmail.com",
            },
            {
                    "id" : "570724e4ae4f8a5026156222",
                    "email" : "a4@gmail.com",
            }
    ],
}, 
{
    "_id" : ObjectId("570185458351bbac27bc9a20"),
    "email" : "test@gmail.com",
    "applicants" : [
            {
                    "id" : "570724e4ae4f8a5026156555",
                    "email" : "a@gmail.com",
            },
            {
                    "id" : "570724e4ae4f8a5026156666",
                    "email" : "a2@gmail.com",
            },
    ],
},
{
    "_id" : ObjectId("570185458351bbac27bc9a20"),
    "email" : "test2@gmail.com",
    "applicants" : [
            {
                    "id" : "570724e4ae4f8a5026156555",
                    "email" : "a@gmail.com",
            },
            {
                    "id" : "570724e4ae4f8a5026156666",
                    "email" : "a2@gmail.com",
            },
    ],
 }

我想获取电子邮件 = test@gmail.com 的文档的所有数组中的元素计数。我该如何计算?

我正在使用以下内容通过电子邮件 test@gmail.com 获取文档数量:

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

如何继续计算电子邮件为 test@gmail.com 的文档的所有申请人数组中的元素数量?上面示例的可能是:6.

编辑:

根据其中一个答案,我将查询修改为以下内容:

答案 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);
            }
        });

答案 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);
         });

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    这可能需要编写一个聚合,因为您需要计算按电子邮件分组的申请者数组的大小:

    这是返回带有计数的预期电子邮件的等效 mongodb 查询:

    db.yourCollection.aggregate(
    
      [{$match:{"email" : "test@gmail.com"}}, 
    
      {$project:{_id:0, email:1,totalEmails:{$size:"$applicants"}}},  
    
      {$group:{_id:"$email", count:{$sum:"$totalEmails"}}}])
    

    这将返回{ "_id" : "test@gmail.com", "count" : 6 }

    您可能需要根据您的代码进行更改。

    【讨论】:

    • 我已经尝试过了,但我似乎无法让它工作,我需要稍微修改一下查询,但仍然没有运气。我已经用我尝试过的查询更新了我的原始帖子。
    【解决方案2】:

    您可以改为使用聚合查询:

    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});
            }
        });
    

    这将为您生成一份文档,其中 count 将具有您所需的结果

    【讨论】:

    • 似乎不起作用,我稍微修改了查询,但每次调用它时,节点中都会出现 500 错误。我已将更新后的查询添加到我的帖子中。有什么想法可能是错的吗?
    • 查看我的编辑。如果仍然不起作用,请告诉我结果的输出。结果将始终是一个数组,您可能需要检查结果长度是否大于 0
    • 修改后的查询出现的错误是“TypeError:collection.aggregate 不是函数”。根据我在网上阅读的内容,它通常必须使用没有回调的聚合函数,但在这种情况下,函数(错误,结果)是否正确?我还需要在 {$sum :1} 之后添加一个额外的 }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多