当前位置: 首页 > 知识库问答 >
问题:

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

龙志勇
2023-03-14

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

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

             ...
         ]
}

其中每个文档包含一个子文档数组,我希望将集合转换为以下结构的文档:

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

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

我知道如何使用爪哇脚本片段进行评估。它很慢。我的问题是:如何使用聚合管道完成此操作?

共有1个答案

东方涛
2023-03-14

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

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

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

 类似资料:
  • 我在尝试使用MongooseJs在Mongodb中按嵌套数组排序时遇到了一个小问题。 a)一个产品包含任务,每个任务都有子任务。 b)任务有顺序 这是一个示例产品文档: 结果: } 我正在使用MongoDB聚合管道来订购任务 结果: } 预期结果: 我真的很接近了,所有的排序似乎都在工作。我只需要一些帮助来将子任务放回父母体内。非常感谢任何帮助。 谢谢

  • 我试图使用MongoDb列出展开嵌套数组。 一个产品包含任务,每个任务可以有零个、一个或多个子任务。 以下是产品文档示例: 结果: 聚合管道在对任务进行排序方面起到了很大的作用 有时任务没有子任务,例如: 当他们没有孩子的时候,还有什么可以帮助他们完成任务吗? 当前聚合: 期望的结果:

  • 我想从引用的文档中获取字段值。Mongodb版本是3.4。 假设我有两个收藏foo和bar。Foo提到bar: 相应的条形码文档看起来像这样: 我尝试了以下聚合函数来归档此结果: 聚合功能: 但我的结果是这样的: 我试着用谷歌搜索它,我查看了mongodb文档,但没有找到解决方案。 是我错过了什么还是这不可能? 谢谢

  • 如果文档集合包含: 我想构建一个聚合,通过我的myDocRefId字段只返回没有被任何其他文档引用的文档。对于这个集合,我想返回: 文档1在聚合中被删除,因为文档3具有对它的引用。 如何在聚合管道中实现这一点?

  • 假设我有以下JSON结构,我希望按性别分组,并希望在同一字段中返回多个文档值: 现在我知道我可以做这样的事情,但是我需要把年龄和名字合并到一个字段中。

  • 本文向大家介绍使用MongoDB聚合计算NAME字段中重复名称的频率?,包括了使用MongoDB聚合计算NAME字段中重复名称的频率?的使用技巧和注意事项,需要的朋友参考一下 要计算频率,请在中与$group分组。让我们创建一个包含文档的集合- 在方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用MongoDB聚合框架计算频率的查询- 这将产生以下输出-