Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 映射一个';对象数组';到一个简单的键值数组_Arrays_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Arrays 映射一个';对象数组';到一个简单的键值数组

Arrays 映射一个';对象数组';到一个简单的键值数组,arrays,mongodb,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongodb Query,Aggregation Framework,我是mongoDB聚合管道的新手,有一个非常基本的问题,但在任何地方都找不到答案。我只想转换以下块: "exclude" : [ { "name" : "Accenture" }, { "name" : "Aon Consulting" } ] 致: 使用聚合管道,但我似乎无法找到如何做到这一点,即使在阅读了上的文档之

我是mongoDB聚合管道的新手,有一个非常基本的问题,但在任何地方都找不到答案。我只想转换以下块:

"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'
        }
    }
])