如何$在mongodb中的一个子文档中连接两个字段

时间:2018-05-17 17:16:27

标签: mongodb

我想要实现的目标

让我们说我有这个对象:

{
    "_id" : ObjectId("5aec063380a7490014e88792"),
    "personal_info" : {
        "dialing_code": "+44",
        "phone_number": "67467885664"
    }
}

我需要将两个值personal_info.dialing_code(+44)和phone_number(67467885664)连成一个。 +4467467885664并将其与值进行比较。我需要从数据库中检索与该值匹配的特定记录。

问题

我在子文档中连接两个字段时遇到问题,我收到此错误:

{
    "name": "MongoError",
    "message": "$concat only supports strings, not object",
    "ok": 0,
    "errmsg": "$concat only supports strings, not object",
    "code": 16702,
    "codeName": "Location16702"
}

ATTEMPT#1

我试过这个:

UserModel.aggregate([
        { $unwind: '$personal_info' },
        {$project: {
            concat_p: {$concat: [
                '$personal_info.dialing_code',
                '$personal_info.phone_number'
            ]} 
        }}
    ])

如上所述,它给了我一个错误,结果我不能在之后做$ match。

ATTEMPT#2

我也试过这个:

UserModel.aggregate([
        { $unwind: '$personal_info' },
        {$project: {
            p_dialing_code: '$personal_info.dialing_code',
            p_phone_number: '$personal_info.phone_number',
            concat_p: {$concat: [
                '$p_dialing_code',
                '$p_phone_number'
            ]} 
        }}
    ])

我已经成功地取出了一个级别的子文档值,但是当我尝试concatinating时,它产生了我的空值。这是我得到的结果:

{
        "_id": "5af0998036daa90014129d6e",
        "p_dialing_code": "+44",
        "p_phone_number": "13231213213244",
        "concat_p": null
    }

我知道如何在$ match管道上执行此操作,但我没有运气来协调子文档中的值。显然,在我比较之前,我需要先做这件事。感谢

1 个答案:

答案 0 :(得分:1)

您似乎在personal_info.dialing_codepersonal_info.phone_number字段下有不同的类型。在您的示例中,$concat适用于您的集合中的每个文档,这就是您获得异常的原因,因为$concat严格要求其参数为strings

因此,对于您的问题中发布的文档,它会正常工作,但会抛出这样的例外:

{
    "_id" : ObjectId("5aec063380a7490014e88792"),
    "personal_info" : {
        "dialing_code": {},
        "phone_number": "67467885664"
    }
}

解决此问题的一种方法是在$match之前添加$project条件,并使用$type运算符仅获取要连接的字段上包含strings的文档。< / p>

db.UserModel.aggregate([
    {
        $match: {
            $expr: {
                $and: [
                    { $eq: [ { $type: "$personal_info.dialing_code" }, "string" ] },
                    { $eq: [ { $type: "$personal_info.phone_number" }, "string" ] }
                ]
            }
        }
    },
    {$project: {
        concat_p: {$concat: [
            "$personal_info.dialing_code",
            "$personal_info.phone_number"
        ]} 
    }}
])