Mongodb 更新文档中的一个字段,然后根据前一个字段的值更新另一个字段
Mongodb Update a field in a document and then update another depending on the value of previous field
我有这样的文档
{
"_id": ObjectId("626f942bb092f78afd9dad9d"),
"item_id": "external _id222",
"metadata": {
"item_name": "abc",
"quantity": 123,
"state": null
},
}
我想做的是,$inc
即增加 quantity
的计数,然后将 state
更新为已售出,如果 quantity
等于 124。我可以通过 2 个查询、更新 quantity
、执行 if-else 检查然后更新 state
来做到这一点。有没有办法在 update()
的一个查询中做到这一点? (最好不要聚合)
你可以这样做
- 检查
quantity
是否为 123
- 然后将
quantity
和 set
状态增加到 SOLD
db.collection.update({
"metadata.quantity": 123
},
{
"$inc": {
"metadata.quantity": 1
},
"$set": {
"metadata.state": "SOLD"
}
},
{
"multi": false,
"upsert": false
})
这里的诀窍是你需要检查$inc
操作之前的值。
使用 MongoDB v4.2+,您可以使用聚合管道通过单个更新来实现原子行为。使用 $add
进行增量并使用 $cond
检查数量 = 123
db.collection.update({
"item_id": "external _id222"
},
[
{
$set: {
"metadata.quantity": {
$add: [
"$metadata.quantity",
1
]
}
}
},
{
$set: {
"metadata.state": {
$cond: {
if: {
$eq: [
"$metadata.quantity",
124
]
},
then: "SOLID",
else: "$metadata.state"
}
}
}
}
],
{
multi: true
})
这里是Mongo playground供大家参考。
我有这样的文档
{
"_id": ObjectId("626f942bb092f78afd9dad9d"),
"item_id": "external _id222",
"metadata": {
"item_name": "abc",
"quantity": 123,
"state": null
},
}
我想做的是,$inc
即增加 quantity
的计数,然后将 state
更新为已售出,如果 quantity
等于 124。我可以通过 2 个查询、更新 quantity
、执行 if-else 检查然后更新 state
来做到这一点。有没有办法在 update()
的一个查询中做到这一点? (最好不要聚合)
你可以这样做
- 检查
quantity
是否为 123 - 然后将
quantity
和set
状态增加到SOLD
db.collection.update({
"metadata.quantity": 123
},
{
"$inc": {
"metadata.quantity": 1
},
"$set": {
"metadata.state": "SOLD"
}
},
{
"multi": false,
"upsert": false
})
这里的诀窍是你需要检查$inc
操作之前的值。
使用 MongoDB v4.2+,您可以使用聚合管道通过单个更新来实现原子行为。使用 $add
进行增量并使用 $cond
检查数量 = 123
db.collection.update({
"item_id": "external _id222"
},
[
{
$set: {
"metadata.quantity": {
$add: [
"$metadata.quantity",
1
]
}
}
},
{
$set: {
"metadata.state": {
$cond: {
if: {
$eq: [
"$metadata.quantity",
124
]
},
then: "SOLID",
else: "$metadata.state"
}
}
}
}
],
{
multi: true
})
这里是Mongo playground供大家参考。