我如何$对象数组中的concat字段?

doc*_*uke 5 mongodb aggregation-framework

是)我有的

我有以下文档进入我的聚合管道:

[
    { 
        "email" : "email@example.com", 
        "name"  : "Organization Name",  
        "users" : [
            {
                "lastName"  : "Nye", 
                "firstName" : "Bill", 
                "email"     : "bnye@example.com"
            },
            {
                "lastName"  : "Rogers", 
                "firstName" : "Mr.", 
                "email"     : "mrrogers@example.com"
            }
        ]
    },
    ...
]
Run Code Online (Sandbox Code Playgroud)

我想要的是

使用$project我想要每个数组子文档中$concatfirstNamelastName字段来获得以下结果:

{ 
    "email" : "email@example.com", 
    "name"  : "Organization Name",  
    "users" : [
        {
            "name"  : "Bill Nye", 
            "email" : "bnye@example.com"
        },
        {
            "name"  : "Mr. Rogers", 
            "email" : "mrrogers@example.com"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了什么 - 尝试#1

我尝试过以下聚合:

db.organizations.aggregate([
    {
        $project: {
            email : 1,
            name  : 1,
            users : {
              name  : { $concat : [ "$users.firstName", " ", "$users.lastName" ] },
              email : 1
            }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

...但我收到以下错误:

$ concat只支持字符串,而不支持Array

我尝试了什么 - 尝试#2

我也尝试过以下聚合:

db.organizations.aggregate([
    {
        $project: {
            email : 1,
            name  : 1,
            users : {
              name  : { $concat : [ "$firstName", " ", "$lastName" ] },
              email : 1
            }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

......但name总是回来null.

我觉得这应该是一个相对简单的事情,但是,我完全被难倒了.

如何获得我正在寻找的结果?

sty*_*ane 10

您只需通过$project文档执行此$map操作,然后使用聚合变量运算符将$concat表达式应用于数组中的每个项目,并返回包含应用结果的数组.

db.organizations.aggregate(
    [
        { "$project": { 
            "email": 1, 
            "name": 1, 
            "users": { 
                "$map": { 
                    "input": "$users", 
                    "as": "u", 
                      "in": { 
                          "name": { "$concat" : [ "$$u.firstName", " ", "$$u.lastName" ] }, 
                          "email": "$$u.email" 
                      } 
                }
            } 
        }} 
    ]
)
Run Code Online (Sandbox Code Playgroud)

  • @docksteaderluke第一个问题是管道的长度.第二个是管道中存在`$ unwind`.`$ unwind`在性能方面非常昂贵,因为它产生了每个文档的笛卡尔积和文档中的数组字段.这导致在管道中处理更多文档. (2认同)