我有一个更新语句,用于在2.2.6中工作,但在2.8.x和3.0.1中失败
简而言之:我有一系列项目,我想更新一个名为' CreateDeliveries'以及“没有开始”的状态。
问题是这只是更新数组中的第一个元素,而不是匹配的元素(即最后一个元素)。
在2.2.6中,这很好。
在2.8.x中,这会更新第一个元素(不正确)
在3.0.1中,这会更新零行。
这是我的测试文件..
{
"_id" : ObjectId("5510070f7baa49e5db605c89"),
"cacheIds" : [
"456"
],
"expectedSteps" : [
{
"name" : "CacheBuildProcessor",
"state" : "ENDED"
},
{
"name" : "CacheProcessors",
"state" : "NOT STARTED"
},
{
"name" : "ProductSequential",
"state" : "NOT STARTED"
},
{
"name" : "PriceSequential",
"state" : "NOT STARTED"
},
{
"name" : "Data to CSV",
"state" : "NOT STARTED"
},
{
"name" : "CreateDeliveries",
"state" : "NOT STARTED"
}
]
}
注意:cacheIds也是一个数组,这可能会影响它。
db.getCollection('TEST').update(
{
"cacheIds" : "456" ,
"expectedSteps" : {
"$elemMatch" :
{ "name" : "CreateDeliveries" , "state" : "NOT STARTED"}
}
},
{
$set: {"expectedSteps.$.state" : "ENDED"}
}
);
现在我已经尝试使用投影来返回我关心的数组部分,所以只是让它更新该部分,但这似乎不是一个有效的查询/更新命令(它是一个有效的查询)。
有没有人有任何想法?
答案 0 :(得分:0)
令人惊讶的是,cacheIds
数组导致了这种不当行为。我尝试了多种查询,但无法使其运行。
只要我将cacheIds
更改为标准的非数组类型,您的查询就会按预期运行。
我也遇到了一个有趣的读物,表明了类似的行为:
答案 1 :(得分:0)
这实际上是As Designed。
https://jira.mongodb.org/browse/SERVER-17765
我需要使用$ Projection运算符来限制我得到的内容,所以只更新我想要的部分。