在mongodb中将聚合与$ group一起使用

时间:2018-12-25 12:24:46

标签: node.js mongodb mongodb-query aggregation-framework

我在from validate_email import validate_email is_valid = validate_email('example@example.com',verify=True) 集合中有数据,如下所示:

worksheets

我必须创建一个汇总查询来汇总小时数,其中isBilling等于true,而isBilling等于false。我想要以下输出:

/* 1 */
{
    "_id" : ObjectId("5c21d780f82aa31334ab6506"),
    "isBilling" : true,
    "hours" : 6,
    "userId" : ObjectId("5c1f38a1d7537d1444738493"),
}

/* 2 */
{
    "_id" : ObjectId("5c21d780f82aa31334ab6507"),
    "isBilling" : true,
    "hours" : 4,
    "userId" : ObjectId("5c1f38a1d7537d1444738493"),
}

/* 3 */
{
    "_id" : ObjectId("5c21e10fae07cc1204a5b647"),
    "isBilling" : false,
    "hours" : 8,
    "userId" : ObjectId("5c1f388fd7537d1444738492"),
}

我必须获取具有特定userId的数据。我尝试了以下方法:

{
 "billingHours":10,
 "fixContract":8
}

我得到以下结果:

Worksheet.aggregate([
  {
        $match: conditions
  },
  {
      $lookup:{
          "from": "worksheets",
          "let": {},
          "pipeline": [
            { "$match": { "$expr": { "$eq": [ "$isBilling",false] } } },
            { 
              "$group": { "_id": null, "totalHours": { "$sum": "$hours" } }
            },
          ],
          "as": "billingHours"
      }
  },
  {
        "$project":{"billingHours":1}
  }
])

我不知道为什么它会给我16小时而不是10小时,而给我两个对象而不是1个。

1 个答案:

答案 0 :(得分:1)

您无需在此处使用$lookup。简单的$group$cond即可完成工作。

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "billingHours": {
      "$sum": {
        "$cond": [{ "$eq": ["$isBilling", true] }, "$hours", 0]
      }
    },
    "fixContract": {
      "$sum": {
        "$cond": [{ "$eq": ["$isBilling", true] }, 0, "$hours"]
      }
    }
  }}
])