我发现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",
...
}
答案 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