Arrays 映射一个';对象数组';到一个简单的键值数组
我是mongoDB聚合管道的新手,有一个非常基本的问题,但在任何地方都找不到答案。我只想转换以下块:Arrays 映射一个';对象数组';到一个简单的键值数组,arrays,mongodb,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongodb Query,Aggregation Framework,我是mongoDB聚合管道的新手,有一个非常基本的问题,但在任何地方都找不到答案。我只想转换以下块: "exclude" : [ { "name" : "Accenture" }, { "name" : "Aon Consulting" } ] 致: 使用聚合管道,但我似乎无法找到如何做到这一点,即使在阅读了上的文档之
"exclude" : [
{
"name" : "Accenture"
},
{
"name" : "Aon Consulting"
}
]
致:
使用聚合管道,但我似乎无法找到如何做到这一点,即使在阅读了上的文档之后。感谢您的帮助。您使用聚合框架处理转换的方向是正确的。在这种情况下,只将数组中的对象键映射到键值数组的主运算符将是 在管道中一起使用它来投影转换后的字段,如下所示:
db.collection.aggregate([
{
"$addFields": {
"exclude": {
"$map": {
"input": "$exclude",
"as": "el",
"in": "$$el.name"
}
}
}
}
])
在上述情况下,管道阶段会向文档添加新字段,如果新字段的名称与现有字段名称(包括
\u id
)相同,将使用指定表达式的值覆盖该字段的现有值
因此,从本质上讲,上面使用将
排除数组替换为转换后的数组将表达式应用于输入数组的每个元素。表达式使用as
字段中指定的变量名($$el
)分别引用每个元素,并返回一个包含应用结果的数组。尽管@chridam的答案正确,但无需使用$map
。
简单的$addFields
/$project
就足够了:
db.collection.aggregate([
{
$addFields: {
exclude : '$exclude.name'
}
}
])
谢谢你的快速回答。它就像一个符咒!你的解释也很有见地。干杯@RaenyvonHaus不用担心,很乐意帮忙为什么我们在这里使用双$
“in”:“$$el.name”
?@Morozov它们用于表示如何使该列表独一无二?
db.collection.aggregate([
{
$addFields: {
exclude : '$exclude.name'
}
}
])