降低特定文档中第一个找到的子元素的属性

时间:2018-08-29 05:35:35

标签: mongodb mongodb-query

我有这个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了,所以我不应该减少它,因为我不能有一个负数,因此更新应该寻找下一个元素,更新量为{{1 }}车到"green"

下次运行查询时,0"red"的汽车数量为"green",因此我应减少0的汽车数量。如果我多次运行查询,则应将"blue"的汽车减少到"blue",然后对0进行同样的操作,直到到达"yellow",最后,查询什么也不做

1 个答案:

答案 0 :(得分:2)

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

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

所有amounts均为零时将不会更新