【问题标题】:How to $concat two fields inside a subdocument in mongodb如何在mongodb的子文档中$ concat两个字段
【发布时间】:2018-05-18 02:02:54
【问题描述】:

我想要达到的目标

假设我有这个对象:

{
    "_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"
}

尝试 #1

我试过这个:

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

如上所述,它给了我一个错误,结果我无法立即进行 $match 。

尝试 #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'
            ]} 
        }}
    ])

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

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

我知道如何在 $match 管道上执行此操作,但我没有运气连接子文档中的值。显然,我需要先这样做才能进行比较。谢谢

【问题讨论】:

  • 两件事可能会有所帮助:1. $unwind 用于数组而不是嵌套对象 2. 第一个示例适用于您的示例文档。也许您的收藏中有一些具有不同“模式”的文档。这可能吗?
  • 即使我删除了$unwind,第一个示例也不起作用。我在personal_info 对象中有其他文档。在示例中,为了示例,我只是专门获取 dialing_code 和 phone_number。但在其中,是的,我也有嵌套对象,但我不需要处理它。这会影响我的查询吗?
  • 顺便说一句,在“模式”设计级别,我没有为内部字段显式定义字符串类型,因为我使其无模式,即personal_info: mongoose.Schema.Types.Mixed,。这可能是我无法获得结果的问题吗?

标签: mongodb


【解决方案1】:

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

因此,对于您问题中发布的文档,它可以正常工作,但会为以下内容引发异常:

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

解决此问题的一种方法是在$project 之前添加$match 条件并使用$type 运算符仅获取在您要连接的那些字段上具有strings 的文档。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2014-11-12
    • 2021-05-16
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多