我在产品集合中有一个文档:
{
"_id" : ObjectId("629868369f69156e9a0592b4"),
"product_id" : "2",
"stock" : 4.0,
"stock_history" : 1.0,
"availability" : true
}
如果我这样做:
db.getCollection("products").updateOne(
{'product_id': '2'},
{
$set: {
stock: 2.0,
availability: true,
stock_history: {
$cond: [
{$ne: ['$stock', 2.0]},
2,
'$stock'
]
}
}
}
)
基本上,我希望stock字段更新为2,stock_history更新为旧值,即4.0。
相反,stock字段得到更新,stock_history字段变为:(整个文档)
{
"_id" : ObjectId("629868369f69156e9a0592b4"),
"product_id" : "2",
"stock" : 2.0,
"stock_history" : {
"$cond" : [
{
"$ne" : [
"$stock",
2.0
]
},
2.0,
"$stock"
]
},
"availability" : true
}
我注意到,如果我使用。update而不是。updateone,像这样:
db.getCollection("products").update(
{'product_id': '2'},
[{
$set: {
stock: 2.0,
availability: true,
stock_history: {
$cond: [
{$ne: ['$stock', 2.0]},
2,
'$stock'
]
}
}
}]
)
工作正常
但是我需要updateOne,因为以后我将使用只支持updateOne的bulkWrite。
我可以看到我的查询与updateOne和update之间的区别,是更新有$set对象之间的方括号,其中updateOne不支持给出这个消息:
更新操作文档必须包含原子操作符
我错过了什么?
啊,我找到问题了。
它也适用于updateOne如果{$set:…}放在方括号中。
唯一的问题是,我使用的是一个旧的shell, mongodb 4.0.2,但我的服务器是5.0.6,只有从mongodb4.2更新和updateOne支持聚合管道。
这就是操作文档必须包含原子操作符的原因.