循环中的MongoDB更新查询
我正在我的一个项目中与MongoDB合作。对于下一个特性,我需要通过循环匹配条件向对象数组添加一个标志 下面是我所拥有的一个文档示例-循环中的MongoDB更新查询,mongodb,Mongodb,我正在我的一个项目中与MongoDB合作。对于下一个特性,我需要通过循环匹配条件向对象数组添加一个标志 下面是我所拥有的一个文档示例- { "_id" : ObjectId("5aaa4eb211a1c1c1f74c1657"), "colors" : [ { "status" : "done" }, { "status" : "done" }, { "status" : "n/a" } ] } 输出应该是- {
{
"_id" : ObjectId("5aaa4eb211a1c1c1f74c1657"),
"colors" : [
{ "status" : "done" },
{ "status" : "done" },
{ "status" : "n/a" }
]
}
输出应该是-
{
"_id" : ObjectId("5aaa4eb211a1c1c1f74c1657"),
"colors" : [
{
"status" : "done",
"is_in_production" : true
},
{
"status" : "done",
"is_in_production" : true
},
{
"status" : "n/a"
}
]
}
我使用了以下查询-
db.getCollection('products').update(
{
"colors.status": {
"$in":[
"done"
]
}
},
{$set: { 'colors.$[].is_in_production' :true }},
{multi: true}
)
这导致了以下错误-
cannot use the part(colors of colors.$[].is_in_production)totraversetheelement({ colors: [{ "status" : "done" }, { "status" : "done" }, { "status" : "n/a" }] )}
有人能帮我查询一下吗??提前感谢使用
阵列过滤器
仅更新嵌入文档的子集
请尝试以下查询:
db.products.update(
{
"colors.status": {
"$in":[
"done"
]
}
},
{$set: { 'colors.$[element].is_in_production' :true }},
{multi: true, arrayFilters:[{"element.status":"done"}]}
)
db.sample.findAndModify({
query:{
"colors.status": {
"$in":[
"done"
]
}
},
update:{$set: { 'colors.$[element].is_in_production' : true }},
multi: true,
arrayFilters:[{"element.status":"done"}]
})
输出为:
/* 1 */
{
"_id" : ObjectId("5aaa4eb211a1c1c1f74c1657"),
"colors" : [
{
"status" : "done",
"is_in_production" : true
},
{
"status" : "done",
"is_in_production" : true
},
{
"status" : "n/a"
}
]
}
请注意,您需要MongoDB 3.6,并且需要在最新的shell上执行(最好不要使用第三方工具),以便ArrayFilter
正常工作
如果上述查询不适用于您的Mongo版本,请尝试以下查询:
db.products.update(
{
"colors.status": {
"$in":[
"done"
]
}
},
{$set: { 'colors.$[element].is_in_production' :true }},
{multi: true, arrayFilters:[{"element.status":"done"}]}
)
db.sample.findAndModify({
query:{
"colors.status": {
"$in":[
"done"
]
}
},
update:{$set: { 'colors.$[element].is_in_production' : true }},
multi: true,
arrayFilters:[{"element.status":"done"}]
})
与一起使用可更新数组中的多个文档
db.products.updateMany(
{ "colors.status": "done" },
{ $set: { "colors.$[element].is_in_production" : true}},
{ arrayFilters: [{"element.status" : "done"}]}
)
首先,请检查您的Mongo版本。我在我的本地(MongoDB 3.6.3)上运行了你的查询,我看到的结果是:1)2),因此你的查询是错误的。Mate,你的结果,显示了所有带有颜色数组的对象,带有“is_in_production”:true。我希望仅为具有“状态”的对象添加标志:“完成”。我正在使用MongoDB shell v3.4.7版,这就是我所说的
您的查询是错误的
您需要升级您的版本,我已经在下面的答案中更新了您的查询。希望有帮助!是否有其他方法重写同一查询??我在Docker上运行MongoDb。升级需要很多时间。或者可能会破坏其他容器:(使用替代查询更新了答案。希望有帮助!但我仍然怀疑arrayFilter
部分可能不起作用,因为在v3.6上对Find和Modify
进行了一些更新。另外,请注意,您以前对位置运算符$[]
的查询不起作用(忘记这是错误的事实)。这是因为版本问题。用户过去已经报告了您遇到的问题,这就是为什么他们在最新版本中修复了这些问题,并提供了许多功能。我在测试服务器中复制了DB,它成功了。感谢您的帮助!!OP询问是否有除了ArrayFilter
之外的其他方法,因为它已经成功了s对v3.6.OP的严格依赖性正在使用v3.4,他说升级到更高版本可能会有风险。这篇文章除了ArrayFilter之外还有很多其他选项,请查看一下-位置运算符$[]
给出了不正确的结果,这就是为什么留下了阵列过滤器的原因
我在测试服务器中复制了数据库,并且成功了。谢谢你的帮助!!