node.js - 在 mongodb 中使用聚合与 $group

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

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

/* 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"),
}

我必须创建一个聚合查询来对小时数求和,其中 isBilling 等于 true,isBilling 等于 false。我想要以下输出:

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

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

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

我得到以下结果:

[
    {
        "_id": "5c21d780f82aa31334ab6506",
        "billingHours": [
            {
                "_id": null,
                "totalHours": 16
            }
        ]
    },
    {
        "_id": "5c21d780f82aa31334ab6507",
        "billingHours": [
            {
                "_id": null,
                "totalHours": 16
            }
        ]
    }
]

我不知道为什么它给了我 16 小时而不是 10 小时,并给了我两个对象而不是 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"]
      }
    }
  }}
])

关于node.js - 在 mongodb 中使用聚合与 $group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53922374/

相关文章:

node.js - 将 Socket.io-redis 作为适配器添加到 Socket.io 实例时出现错误

python - 如何比较通过 PyMongo 存储在 MongoDB 中的 Twitter 数据的日期?

javascript - 如何在 mongodb 中将 $push 、 $set 和 $inc 放在一起?

java - 如何为 Spring Data 中的类配置 MongoDb 集合名称

Mongodb:在两个字段的数组上创建索引

node.js - 如何使用 websockets 监听 mongodb 中的更新

mysql - Angular Universal 中的异步 Node.js 请求。服务器渲染停止工作

node.js - Jest Snapshot 在 updateSnapshot 上未正确格式化为漂亮的格式,例如。没有将对象或数组添加到快照中

javascript - 如何正确使用基于 Javascript Promise 的函数

javascript - 如何使用脚本在 mongodb 中创建用户?