Совпадение в массиве в текущем документе - PullRequest
1 голос
/ 02 мая 2019

В конвейере агрегации, работающем с такими документами, как

{
    "availablePackages": [
        {
            "title": "Silver",
            "code": "001",
        },
        {
            "title": "Gold",
            "code": "002",
        },
        {
            "title": "Platinum",
            "code": "003",
        },
    "selectedPackageCode": "002"
}

Мне нужно заменить все в приведенном выше документе заголовком пакета, код которого совпадает с selectedPackageCode. Поэтому я хочу, чтобы конвейер закончился с

{
    "packageTitle": "Gold"
}

Это не поиск, потому что он находится в текущем документе. Я думал, что смогу использовать $let для создания переменной, а затем $match, чтобы найти правильный элемент массива, но я не нашел синтаксис, который работает.

1 Ответ

0 голосов
/ 02 мая 2019

Вам необходимо $ filter , чтобы сопоставить availablePackages с selectedPackageCode и $ arrayElemAt , чтобы получить первый соответствующий элемент. Чтобы сделать это за один этап агрегации, вы можете использовать $ let для определения временной переменной:

db.col.aggregate([
    // ... other stages
    {
        $project: {
            packageTitle: {
                $let: {
                    vars: { 
                        selectedPackage: {
                            $arrayElemAt: [
                                { $filter: { input: "$availablePackages", cond: { $eq: [ "$$this.code", "$selectedPackageCode" ] } } }, 0
                            ]
                        } 
                    },
                    in: "$$selectedPackage.title"
                }
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...