【问题标题】:Create MongoDB fields with names based on sub-document values using aggregation pipeline?使用聚合管道创建名称基于子文档值的 MongoDB 字段?
【发布时间】:2014-10-10 20:07:39
【问题描述】:

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

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

             ...
         ]
}

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

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

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

我知道如何使用带有 Javascript sn-p 的 eval 执行此操作。它很慢。我的问题是:如何使用聚合管道来做到这一点?

【问题讨论】:

  • 聚合框架无法从“值”输出“键”名称。您需要 JavaScript 评估,例如 mapReduce,这将改变您的输出。在后期处理中进行。但无论如何,为您的密钥使用“数据”是一种不好的做法。 { "animal": "cat", "count": 10 }, { "animal": "dog", "count": 20 } 更加自然,因为您不必检查键,而是使用当前值。还是可以接受,但您只是不知道如何将其作为单独的文档从数组中取出?
  • @NeilLunn - 谢谢尼尔。是的,我已经使用 mapReduce 了;希望找到一种聚合方式以获得最大性能。这里的动物示例是人为的,对于我的实际应用,使用值作为键名有一些优势。
  • 重点是值作为键名是不好的做法。聚合框架不支持这种输出。

标签: mongodb aggregation-framework


【解决方案1】:

根据this功能请求及其解决方案,将为该功能添加新功能-称为arrayToObject的函数。

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

但目前,没有解决方案。我建议你改变你的数据结构。据我所知,有许多功能请求标记为主要,但多年未完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2015-07-14
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多