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

时间:2018-10-26 02:34:15

标签: 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的工作方式

1 个答案:

答案 0 :(得分:0)

您可以通过以下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需要$arrayToObject对象。最后是$replaceRoot

这需要 MongoDB 3.6 及更高版本,因为该版本中引入了$push。在此之前,您必须使用void main() { char * a = getenv("ANCHOR_STEM"); if (strlen(a)>0) printf("%s\n", a); } 等。