Уменьшить свойства первого найденного дочернего элемента в конкретном документе - PullRequest
0 голосов
/ 29 августа 2018

У меня есть коллекция MongoDB, содержащая различные документы, подобные тем, которые я здесь показываю.

{
"_id" : ObjectId("5b0b456bf7a87830b4d20058"),
"type" : "vehicles"
"cars" : [ 
    {
        "color" : "red",
        "amount" : 0
    }, 
    {
        "color" : "green",
        "amount" : 1
    }, 
    {
        "color" : "blue",
        "amount" : 3
    }, 
    {
        "color" : "yellow",
        "amount" : 2
        }
    ]
}

Мне нужно найти документ на "_id" : ObjectId("5b0b456bf7a87830b4d20058") и уменьшить на одну сумму "cars", не обращая внимания на его красный, зеленый, синий или желтый цвет. В этом примере "red" машин уже 0, поэтому я не должен уменьшать их, потому что у меня не может быть отрицательной суммы, поэтому при обновлении следует искать следующий элемент и обновлять количество "green" машин до * 1009. *.

В следующий раз, когда я выполню запрос, количество машин "red" и "green" будет 0, поэтому я должен уменьшить количество машин "blue". Если я выполню запрос больше раз, он должен уменьшить "blue" автомобилей до 0, а затем делать то же самое с "yellow", пока он тоже не достигнет 0 и, наконец, запрос ничего не сделает.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете использовать позиционный оператор $ , чтобы определить, какой элемент массива должен быть обновлен. Он просто берет первый соответствующий элемент массива, чтобы вы могли определить условие $gt, чтобы модифицировать только те, которые имеют amount > 0. $ inc может использоваться для уменьшения amount значения

db.col.update({ _id: ObjectId("5b0b456bf7a87830b4d20058"), "cars.amount" : { $gt: 0 } }, { $inc: { "cars.$.amount": -1 } })

Обновления не будет, когда все amounts равны нулю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...