MongoDB - 如何编写嵌套组聚合查询

MongoDB - How to write a nested group aggregation query

我有一个这种格式的集合:

{
  "place":"land",
  "animal":"Tiger",
  "name":"xxx"
},
{
  "place":"land",
  "animal":"Lion",
  "name":"yyy"
}

我希望结果是这样的:

{
  "place":"land".
  "animals":{"Lion":"yyy", "Tiger":"xxx"}
}

我写了下面的查询。我觉得还需要再开一个小组赛但是写不出来

db.collection.aggregate({
  '$group': {
  '_id':{'place':'$place', 'animal':'$animal'},
  'animalNames': {'$addToSet':'$name'}
  }
})

需要进行哪些更改才能获得所需的结果?

  1. $group - 按 animals 分组。将 { k: "animal", v: "name" } 类型的对象推入 animals 数组。
  2. $project - 修饰输出文档。通过 $arrayToObject.
  3. animals 数组转换为 key-value 对
db.collection.aggregate([
  {
    "$group": {
      "_id": "$place",
      "animals": {
        "$push": {
          k: "$animal",
          v: "$name"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      place: "$_id",
      animals: {
        "$arrayToObject": "$animals"
      }
    }
  }
])

Sample Mongo Playground

如果您的版本 >=4.4,一个合理的替代方法是使用 $function 运算符:

db.foo.aggregate([
    {$project: {
        'income_statement.annual': {
            $function: {
                body: function(arr) {                      
                    return arr.sort().reverse();
                },
                args: [ "$income_statement.annual" ],
                lang: "js"
            }}
    }}
]);