【问题标题】:Aggregate with $sum in mongodb在 mongodb 中与 $sum 聚合
【发布时间】:2018-12-27 15:19:06
【问题描述】:

我在worksheets 集合中有如下数据:

/* 1 */
{
    "_id" : ObjectId("5c21d780f82aa31334ab6506"),
    "isBilling" : true,
    "hours" : 6,
    "userId" : ObjectId("5c1f38a1d7537d1444738467"),
    "projectId": ObjectId("5c1f38a1d7537d1444731234");
}

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

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

我正在使用以下聚合查询来获取字段总数:

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

现在我想要唯一 projectId 字段的总和。上面的情况是2。我通过在上面实现的查询中应用两个 $group 来尝试它。但它不起作用。我想得到如下结果:

[
  {
    "_id": null,
    "billingHours": 0,
    "fixContract": 8,
    "totalProjects": 2
  }
]

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    使用$addToSet 累加器,然后使用$size 运算符计算唯一projectId 的数量

    Worksheet.aggregate([
      { $match: conditions },
      { "$group": {
        "_id": null,
        "billingHours": {
          "$sum": {
            "$cond": [{ "$eq": ["$isBilling", true] }, "$hours", 0]
          }
        },
        "fixContract": {
          "$sum": {
            "$cond": [{ "$eq": ["$isBilling", true] }, 0, "$hours"]
          }
        },
        "projectIds": { "$addToSet": "$projectId" }
      }},
      { "$addFields": { "projectIds": { "$size": "$projectIds" }}}
    ])
    

    【讨论】:

    • 非常感谢,它成功了。但是你能解释一下这里的 $addToSet 和 $size 是什么吗?
    • $size 用于计算数组中元素的数量。而$addToSet 用于在数组中添加推送元素(唯一),
    • 你可以像我们一样在这里提问
    • 不,你不能。两者都是聚合管道阶段。
    • 那么,如果我必须从项目集合中获取项目总数,那我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 2020-05-14
    • 2015-11-13
    • 2016-11-16
    • 1970-01-01
    • 2020-02-06
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多