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

时间:2016-07-06 17:57:39

标签: 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"
            }
        ]
    },
    ...
]

我想要什么

使用$project我想$concat每个数组子文档中的firstNamelastName字段,以获得以下结果:

{ 
    "email" : "email@example.com", 
    "name"  : "Organization Name",  
    "users" : [
        {
            "name"  : "Bill Nye", 
            "email" : "bnye@example.com"
        },
        {
            "name"  : "Mr. Rogers", 
            "email" : "mrrogers@example.com"
        }
    ]
}

我尝试了什么 - 尝试#1

我尝试过以下聚合:

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

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

  

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

我尝试了什么 - 尝试#2

我也尝试过以下聚合:

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

...但name始终返回null

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

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

1 个答案:

答案 0 :(得分: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" 
                      } 
                }
            } 
        }} 
    ]
)