MongoDB聚合框架 - 动态字段重命名

时间:2013-04-02 01:16:41

标签: mongodb mongodb-query

我发现mongodb聚合框架非常强大 - 它似乎是一个很好的选择来展平对象。我的模式在名为materials的数组中使用了一个子对象数组。材料的数量是可变的,但特定的字段(类别)在数组中的对象之间是唯一的。我想使用聚合框架来展平结构,并根据类别字段的值动态重命名字段。我找不到一个简单的方法来实现这个使用$项目和$ cond。有办法吗?

物质对象数组的原因是允许简单搜索:

e.g。 {'materials.name':'XYZ'}拉回找到XYZ的任何文件。

E.g。文件之前和之后

{
"_id" : ObjectId("123456"),
"materials" : [
    {
        "name" : "XYZ",
        "type" : "Red",
        ...
        "category" : "A"
    },
    {
        "name" : "ZYX",
        "type" : "Blue",
        ...
        "category" : "B"
    }]
}

{
"material_A_name" : "XYZ",
"material_A_type" : "Red",
...
"material_B_name" : "ZYX",
"material_B_type" : "Blue",
...
}

2 个答案:

答案 0 :(得分:5)

jira https://jira.mongodb.org/browse/SERVER-5947中有这样的请求 - 如果你想拥有此功能,请将其投票。

同时,如果您事先知道键的可能值(即“类别”的所有唯一值)并且我有一些示例代码on my blog,则有一种解决方法。< / p>

答案 1 :(得分:1)

这将从MongoDB v4.4开始有用,

  • $map迭代materials数组循环
  • $map在使用name转换为数组之后,迭代type$objectToArray字段的循环,使用{{1} },
  • 返回第一个$concat使用$map将第二个$map的返回结果从数组转换为对象到对象
  • $arrayToObject解构$unwind数组
  • materials为空,并将$group对象合并为一个对象
  • materials替换根目录中的对象
$replaceRoot

Playground