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 运算符来限制我返回的内容,以便只更新我想要的部分。
我有一个用于 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 运算符来限制我返回的内容,以便只更新我想要的部分。