在mongodb聚合中将值转换为键

时间:2018-10-10 11:19:47

标签: mongodb mongodb-query aggregation-framework

只要MongoDB在聚合管道中提供$group方法,它就会返回文档列表,其中_id保留一些“不同”的分组值,而其他字段保留按给定条件分组的文档数组。

我想要返回一个文档,其中属性是聚合的结果。

示例集合:

{author: "Author1", title: "Title1"}
{author: "Author2", title: "Title2"}
{author: "Author2", title: "Title3"}

聚合

db.getCollection('books').aggregate([ 
    {"$group": {
           _id: "$author",
           books: { $push: "$$ROOT" }
          }
    }
])

这给了我以下输出:

{_id: 'Author1', books: [{author: "Author1", title: "Title1"}]},
{_id: 'Author2', books: [{author: "Author2", title: "Title2"}, {author: "Author2", title: "Title3"}]}

但是我希望将结果作为一个单个对象获得,像这样:

{
  Author1: [
    {author: "Author1", title: "Title1"}
  ],
  Author2: [ 
    {author: "Author2", title: "Title2"},
    {author: "Author2", title: "Title3"}
  ]
}

简单地说,我想将_id属性用作结果文档中的新字段,并且特定$group的正确_id值必须是新变量的值。

如果有人遇到这样的问题,请提供帮助或提供一些解决方法的线索。预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下汇总

db.getCollection('books').aggregate([ 
  { "$group": {
    "_id": "$author",
    "books": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": { "k": "$_id", "v": "$books" }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])