首页 > 解决方案 > 减少特定文档上第一个找到的子元素的属性

问题描述

我有这个 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"汽车数量更新为0.

下次我运行查询时,数量"red""green"汽车将是0,所以我应该减少"blue"汽车数量。如果我多次运行查询,它应该减少"blue"汽车0,然后做同样的事情,"yellow"直到它也达到0最后,查询什么也不做。

标签: mongodbmongodb-query

解决方案


您可以使用$ 位置运算符来定义应更新的数组元素。它只需要数组的第一个匹配元素,因此您可以定义$gt条件以仅修改带有amount > 0. $inc可用于降低amount价值

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

amounts全部为零时不会更新


推荐阅读