Как $ concat два поля внутри вложенного документа в mongodb - PullRequest
0 голосов
/ 17 мая 2018

ЧЕГО ХОЧУ ДОСТИГАТЬ

Допустим, у меня есть этот объект:

{
    "_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 Ответ

0 голосов
/ 17 мая 2018

Похоже, у вас есть разные типы в полях personal_info.dialing_code и personal_info.phone_number. В вашем примере $concat применяется к каждому документу в вашей коллекции, и поэтому вы получаете исключение, поскольку $concat строго ожидает, что его параметры равны strings.

Таким образом, он будет работать нормально для документа, размещенного в вашем вопросе, но выдаст исключение для чего-то вроде этого:

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

Один из способов исправить это - добавить условие $match перед $project и использовать оператор $ 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"
        ]} 
    }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...