Mongodb 使用项目数组更新 post v2.2.6

Mongodb update with array of items post v2.2.6

我有一个用于 2.2.6 的更新语句,但在 2.8.x 和 3.0.1

中失败了

简而言之:我有一组项目,我想更新名称为 'CreateDeliveries' 且状态为 'NOT STARTED' 的项目。

问题是这只会更新数组中的第一个元素,而不是匹配的元素(即最后一个元素)。

在 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"}
}
);

现在我尝试只对 return 我关心的数组部分使用投影,所以只是让它更新那个部分,但这似乎不是有效的query/update 命令(这是一个有效的查询)。

有人有什么想法吗?

令人惊讶的是,cacheIds 数组导致了这种不当行为。我已经尝试了您查询的多种变体,但无法成功。

一旦我将 cacheIds 更改为标准的非数组类型,您的查询就按预期工作了。

我还发现了一个有趣的读物,表明了类似的行为:

这实际上是按设计的。

https://jira.mongodb.org/browse/SERVER-17765

我需要使用 $Projection 运算符来限制我返回的内容,以便只更新我想要的部分。