我有这个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"
,最后,查询什么也不做
答案 0 :(得分:2)
您可以使用$ positional operator定义应更新哪个数组元素。它只需要数组的第一个匹配元素,因此您可以定义$gt
条件来仅修改带有amount > 0
的元素。 $inc可用于降低amount
的值
db.col.update({ _id: ObjectId("5b0b456bf7a87830b4d20058"), "cars.amount" : { $gt: 0 } }, { $inc: { "cars.$.amount": -1 } })
所有amounts
均为零时将不会更新