首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mongodb的子文档中$concat两个字段

如何在mongodb的子文档中$concat两个字段
EN

Stack Overflow用户
提问于 2018-05-17 17:16:27
回答 1查看 1.1K关注 0票数 0

我想要实现的

让我们说,我有一个目标:

代码语言:javascript
复制
{
    "_id" : ObjectId("5aec063380a7490014e88792"),
    "personal_info" : {
        "dialing_code": "+44",
        "phone_number": "67467885664"
    }
}

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

问题

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

代码语言:javascript
复制
{
    "name": "MongoError",
    "message": "$concat only supports strings, not object",
    "ok": 0,
    "errmsg": "$concat only supports strings, not object",
    "code": 16702,
    "codeName": "Location16702"
}

尝试#1

我试过这样做:

代码语言:javascript
复制
UserModel.aggregate([
        { $unwind: '$personal_info' },
        {$project: {
            concat_p: {$concat: [
                '$personal_info.dialing_code',
                '$personal_info.phone_number'
            ]} 
        }}
    ])

正如上面提到的那样,它给了我一个错误,因此我不能马上执行$match。

尝试#2

我也试过这个:

代码语言:javascript
复制
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'
            ]} 
        }}
    ])

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

代码语言:javascript
复制
{
        "_id": "5af0998036daa90014129d6e",
        "p_dialing_code": "+44",
        "p_phone_number": "13231213213244",
        "concat_p": null
    }

我知道如何在$match管道上这样做,但我对子文档中的值串连却没有运气。显然,我需要先做这个,然后才能比较。谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-05-17 18:02:54

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

因此,对于发布在您的问题中的文档,它将运行良好,但对于这样的内容会抛出一个例外:

代码语言:javascript
复制
{
    "_id" : ObjectId("5aec063380a7490014e88792"),
    "personal_info" : {
        "dialing_code": {},
        "phone_number": "67467885664"
    }
}

解决这一问题的一种方法是在$match之前添加$project条件,并使用$type操作符只获取要连接的字段中具有strings的文档。

代码语言:javascript
复制
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"
        ]} 
    }}
])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50397124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档