mongodb-query - 将 mongodb 集合分组并将结果输出为单个对象

标签 mongodb-query lodash node-mongodb-native

有没有办法对一个看起来像的集合进行分组

[
  {_id: "5bd258a7877e74059b6b65b2", year: 2017, title: "One"},
  {_id: "5bd258a7877e74059b6b65b3", year: 2017, title: "Two"},
  {_id: "5bd258a7877e74059b6b65b4", year: 2018, title: "Three"},
  {_id: "5bd258a7877e74059b6b65b5", year: 2018, title: "Four"}
]

并将结果输出为

{
  2017: [
    0: {_id: "5bd258a7877e74059b6b65b2", title: "One", …}
    1: {_id: "5bd258a7877e74059b6b65b3", title: "Two", …}
  ],
  2018: [
    0: {_id: "5bd258a7877e74059b6b65b4", title: "Three", …}
    1: {_id: "5bd258a7877e74059b6b65b5", title: "Four", …}
  ]
}

使用 mongodb 聚合?类似于 lodash groupBy 的方式作品

最佳答案

您可以使用以下 mongoDB 聚合来做到这一点:

db.collection.aggregate([{
    $group: {
      _id: "$year",
      docs: {
        $addToSet: "$$CURRENT"
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "data": {
        "$push": {
          "k": {
            $toString: "$_id"
          },
          "v": "$docs"
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$arrayToObject": "$data"
      }
    }
  }
])

你可以看到 result here

我们的想法是以我们可以利用的方式对数据进行分组 $arrayToObject .第一组为您提供按年份分组,其中第二组只是为 $arrayToObject 做准备,这需要 key, value 对象。最后一件事是 $replaceRoot .

这需要 MongoDB 3.6 及更高版本,因为该版本中引入了 $arrayToObject。在此之前,您必须使用 $push 等。

关于mongodb-query - 将 mongodb 集合分组并将结果输出为单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53000624/

相关文章:

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

node.js - 将整个原始文档置于新的属性名称下

node.js - npm 警告已弃用 xxx : what should I do?

mongodb - ModuleNotFoundError : Module not found: Error: Can't resolve 'dns' in 'node_modules/mongodb/lib'

javascript - 无法推断查询字段以在插入时设置错误

MongoDB 切片 - 从嵌套数组中删除最后 n 个元素

mongodb - 计算每个文档的子文档

javascript - 如何使用 lo-dash 以函数式编程方式获得最小的数字(不在数组中)?

javascript - lodash 上是否有 _.merge.apply(_, x); 的替代方案其中 x 是对象数组?

javascript - 使用适用于 Node JS 的 mongodb native 驱动程序记录所有查询