为什么$cond不能与MongoDB 5.0.6中的updateOne和$set一起工作



我在产品集合中有一个文档:

{ 
"_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支持聚合管道。

这就是操作文档必须包含原子操作符的原因.

相关内容

  • 没有找到相关文章

最新更新