使用聚合管道创建基于子文档值的名称的MongoDB字段?

时间:2014-08-17 22:48:00

标签: mongodb aggregation-framework

给定具有以下文档结构的MongoDB集合:

{
    array_of_subdocs:
         [
             {
                 animal: "cat",
                 count: 10
             },
             {
                 animal: "dog",
                 count: 20
             },

             ...
         ]
}

每个文档包含一个子文档数组,我想将集合转换为结构文档:

{
    cat: { count: 10 },
    dog: { count: 20 },
    ...
}

其中每个子文档现在是主文档中以子文档中的一个值命名的新字段的值(在示例中,animal字段的值用于创建新字段的名称,即catdog)。

我知道如何使用带有Javascript代码段的eval执行此操作。这很慢。我的问题是:如何使用聚合管道来完成这项工作?

1 个答案:

答案 0 :(得分:2)

根据this功能请求及其解决方案,将为此功能添加新功能 - 名为arrayToObject的功能。

db.foo.aggregate([
  {$project: {
    array_of_subdocs: {
      $arrayToObject: {
        $map: {
          input: "$array_of_subdocs",
          as: "pair",
          in: ["$$pair.animal", "$$pair.count"]
        }
      }
    }
  }}
])

但此刻,没有解决方案。我建议你改变你的数据结构。据我所知,有许多功能请求标记为 Major ,但多年来都没有。