Получить значение поля по умолчанию для каждого вложенного документа в поле массива в mongo

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

{
    "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
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам понадобится $ карта для преобразования массива с помощью $ 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"
    ]
}

Другие вопросы по теме