MongoDB位置$(更新)运算符错误

MongoDB位置$(更新)运算符错误,mongodb,Mongodb,根据该方法,$运算符可用于将内容更新到与查询文档匹配的嵌入式列表中。我的示例比文档中的示例要复杂一些: db.item.insert({ “_id”:ObjectId(“5398786591846667374b8f7c”), “产出”:[ { “行动”:“视频”, “portalType”:“FACEBOOK”, “地位”:1 }, { “portalType”:“YOUTUBE”, “行动”:“视频”, “地位”:1 } ] }) 现在我执行以下查询: db.item.update( {u

根据该方法,$运算符可用于将内容更新到与查询文档匹配的嵌入式列表中。我的示例比文档中的示例要复杂一些:

db.item.insert({
“_id”:ObjectId(“5398786591846667374b8f7c”),
“产出”:[
{
“行动”:“视频”,
“portalType”:“FACEBOOK”,
“地位”:1
}, 
{
“portalType”:“YOUTUBE”,
“行动”:“视频”,
“地位”:1
}
]
})
现在我执行以下查询:

db.item.update(
{u id:ObjectId('5398786591846667374b8f7c'),
“outputs.portalType”:“YOUTUBE”,
“输出.动作”:“视频”},
{$set:{“outputs.$.status”:numberprint(99)})
令人惊讶的是,结果是outputs数组的第一个元素被修改了(portalType=FACEBOOK),根据我的查询,这肯定是错误的:“outputs包含action=VIDEOportalType=YOUTUBE”


编辑:
为了匹配一个数组中的多个标准并确保所有标准都匹配,应该在update命令的查询部分使用$elemMatch,就像Neil Lunn建议的那样,这实际上是按设计工作的

以下是数据:

{
“_id”:ObjectId(“5398786591846667374b8f7c”),
“产出”:[
{
“行动”:“视频”,
“portalType”:“FACEBOOK”,
“地位”:1
},
{
“portalType”:“YOUTUBE”,
“行动”:“视频”,
“地位”:1
}
]
}
以下是最新消息:

db.item.update(
{ 
“_id”:ObjectId(“5398786591846667374b8f7c”),
“outputs.portalType”:“YOUTUBE”,
“输出.动作”:“视频”
}, 
{“$set”:{“outputs.$.status”:numberprint(99)}
)
结果如下:

{
“_id”:ObjectId(“5398786591846667374b8f7c”),
“产出”:[
{
“行动”:“视频”,
“portalType”:“FACEBOOK”,
“地位”:1
},
{
“portalType”:“YOUTUBE”,
“行动”:“视频”,
“地位”:99
}
]
}
这可能是您的问题,因为您的条件可能没有达到您预期的效果:

db.item.update(
{ 
“_id”:ObjectId(“5398786591846667374b8f7c”),
“产出”:{
“$elemMatch”:{
“portalType”:“YOUTUBE”,
“动作”:“视频”
}
}
}, 
{“$set”:{“outputs.$.status”:numberprint(99)}
)
因此,确保两个条件都存在于数组项中,如前一个表单可能匹配数组的其他成员。匹配仅在“文档”整体上进行,否则

下面是输出:


注意update语句的最后一行和修改过的文档。

Umm。更新中的ObjectId值与示例中的值不同。我想你会发现这确实有效。很抱歉在找虫子的时候打破了你的幻想。谢谢。这只是一个输入错误,错误依然存在;)不。我甚至自己跑过。更新正确的数组成员。你还没有发现bug。你能提供两个命令让它正常运行吗?只要mongoDB版本?我在mongo中的第一篇文章中使用了这两个命令,一个接一个,结果并不是预期的结果。我在中测试了您的代码,当查询更新按照精确的顺序完成时,它就会工作。如果顺序如下:
“_id”:ObjectId(“5398786591846667374b8f7c”),“outputs.action”:“VIDEO”,“outputs.portalType”:“YOUTUBE”
,则修改错误的。“你自己试试看。”迪达克蒙特罗老兄,你觉得我刚刚发布了什么。我当然知道这是可行的。哎呀。在这附近查看我的个人资料。这并不是说我不知道我在说什么。@DidacMontero你似乎在抱怨在线演示不理解
numberrint
。那只是一个网站。现实生活中的MongoDB实例按设计工作。我不介意NumberRint在那里不工作,这不是问题所在。据我所知,更新查询(不是带有elemMatch的查询)不能确保这两个条件都存在,因为当我运行命令时,如果与查询相关的部分是
“_id”:ObjectId(“5398786591846667374b8f7c”),“outputs.action”:“VIDEO”,“outputs.portalType”:“YOUTUBE”
“_id”:ObjectId,我会看到不同的结果(“5398786591846667374b8f7c”),“outputs.portalType”:“YOUTUBE”,“outputs.action”:“视频”“
@DidacMontero你做错了的是你没有按照我的要求阅读所有的答案。请查看上次提到的
$elemMatch
,以及对您发送的查询之间差异的解释。第一个元素中的其他数据是匹配项。位置运算符始终返回第一个匹配项,因为您也可以从提供的文档链接中读取。