使用v2.2.6之后的项目数组更新Mongodb

时间:2015-03-23 14:41:35

标签: mongodb mongodb-query

我有一个更新语句,用于在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"}
}
);

现在我已经尝试使用投影来返回我关心的数组部分,所以只是让它更新该部分,但这似乎不是一个有效的查询/更新命令(它是一个有效的查询)。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:0)

令人惊讶的是,cacheIds数组导致了这种不当行为。我尝试了多种查询,但无法使其运行。

只要我将cacheIds更改为标准的非数组类型,您的查询就会按预期运行。

我也遇到了一个有趣的读物,表明了类似的行为:

答案 1 :(得分:0)

这实际上是As Designed。

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

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