Пытаюсь составить сложный запрос для NO- SQL - PullRequest
2 голосов
/ 03 августа 2020

У меня есть объект в MongoDB, и я пытаюсь написать запрос, который находит документ по company_id, затем проходит через массив purchases и обновляет paid до true во всех записях, которые соответствуют user_id, без перезаписи остальных данных.

{
    _id: 27834682,
    company_id: 27,
    purchases: [
        {
            paid: false,
            user_id: 19,
            items: [{...}, {...}],
            price: 1085
        },
        ...    
    ]
}

Я пробовал

Model.updateMany({company_id: company_id}, {"purchases.$[]": {$set: {paid: true}}})

, но он удалил другие данные в объекте и не смог даже отфильтровать by user_id.

Каким будет правильный подход для этого запроса?

1 Ответ

3 голосов
/ 03 августа 2020

При обновлении поля массива вы можете указать arrayFilters , которые определяют, какие элементы массива обновлять.

Быстрые исправления,

  • определить условие user_id: 19 в arrayFilters, синтаксис <user define key>.<identifier key>,

  • element.user_id, element - это ключ, определяемый пользователем, вы можете установить любое имя ключа, user_id - это поле идентификатора внутри массива

  • операция обновления начинается с $set

  • устанавливает значение для элемента массива, используя $[key], здесь key - Пользователь определяет ключ, который мы определили в arrayFilters, он выглядит purchases.$[element].paid

Model.updateMany(
    { 
        company_id: company_id
    },
    {
        $set: {
            "purchases.$[element].paid": true
        }
    },
    { 
        arrayFilters: [ 
            { 
                "element.user_id": 19
            }
        ]
    }
)
...