Получить значение по умолчанию поля для каждого вложенного документа в поле массива в монго - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть такие документы -

{
    "Details": "WorkProfile" : [
                        {
                                "Company" : "UPS",
                                "JobTitle" : "Preload Package Handler",
                                "JobSkills" : {
                                        "CommonSkills" : [
                                                ObjectId("5ad5ab860b94c96c738e911e")
                                        ],
                                        "OtherSkills" : [
                                                ObjectId("5ad5ab860b94c96c738e9208")
                                        ]
                                }
                        },
                        {
                                "Company" : "L&L Tent and Party",
                                "JobTitle" : "Delivery Driver/ Tent Installation",
                                "JobSkills" : {
                                        "CommonSkills" : [
                                                ObjectId("5ad5ab860b94c96c738e9227")
                                        ],
                                        "OtherSkills" : [ ]
                                }
                        },
                        {
                                "Company" : "All Pro Movers",
                                "JobTitle" : "Mover"
                        },
                        {
                                "Company" : "Carolina Farmin",
                                "JobTitle" : "Head of Cullinary"
                        }
                ],

}

Я хочу получить OtherSkills для каждого поддокумента в разделе WorkProfile. Я пробовал следующее

db.Collection.aggregate([{$match: {"DocId": "669f4a8f-13cd-4780-8115-e3f29b0d9b4f"}}, {$project: {"JobSkills": "$Details.WorkProfile.JobSkills.OtherSkills"}}]).pretty()
{
        "_id" : ObjectId("5ad5ab89af2808b739ba6aac"),
        "JobSkills" : [
                [
                        ObjectId("5ad5ab860b94c96c738e9208")
                ],
                [ ]
        ]
}

Теперь я хочу установить значение по умолчанию для поля, если поле не существует в этом поддокументе. Для этого я попытался использовать команду $ ifNull , подобную этой

 db.ResumeParsedData.aggregate([{$match: {"DocId": "669f4a8f-13cd-4780-8115-e3f29b0d9b4f"}}, {$project: {"JobSkills": {$ifNull: ["$ResumeDetails.WorkProfile.JobSkills.OtherSkills", "null"]}}}]).pretty()
{
        "_id" : ObjectId("5ad5ab89af2808b739ba6aac"),
        "JobSkills" : [
                [
                        ObjectId("5ad5ab860b94c96c738e9208")
                ],
                [ ]
        ]
}

Но я получаю тот же результат, что и в моем первом запросе. Как указать значение по умолчанию для поля, если поле не существует во вложенном документе.

Я ожидаю этот вывод для вышеуказанного документа -

{
    "_id" : ObjectId("5ad5ab89af2808b739ba6aac"),
    "JobSkills" : [
            [
                    ObjectId("5ad5ab860b94c96c738e9208")
            ],
            [ ],
            "null",
            "null"
    ]

}

1 Ответ

0 голосов
/ 10 сентября 2018

Вам нужно $ map , чтобы преобразовать массив, используя $ ifNull

db.col.aggregate([
    {
        $project: {
            "JobSkills": {
                $map: {
                    input: "$Details.WorkProfile",
                    as: "p",
                    in: { $ifNull: [ "$$p.JobSkills.OtherSkills", "null" ] }
                }
            }
        }
    }
]).pretty()

Выходы:

{
    "_id" : ...,
    "JobSkills" : [
            [
                    ObjectId("5ad5ab860b94c96c738e9208")
            ],
            [ ],
            "null",
            "null"
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...