循环中的MongoDB更新查询

循环中的MongoDB更新查询,mongodb,Mongodb,我正在我的一个项目中与MongoDB合作。对于下一个特性,我需要通过循环匹配条件向对象数组添加一个标志 下面是我所拥有的一个文档示例- { "_id" : ObjectId("5aaa4eb211a1c1c1f74c1657"), "colors" : [ { "status" : "done" }, { "status" : "done" }, { "status" : "n/a" } ] } 输出应该是- {

我正在我的一个项目中与MongoDB合作。对于下一个特性,我需要通过循环匹配条件向对象数组添加一个标志

下面是我所拥有的一个文档示例-

{
    "_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之外还有很多其他选项,请查看一下-位置运算符
$[]
给出了不正确的结果,这就是为什么留下了
阵列过滤器的原因
我在测试服务器中复制了数据库,并且成功了。谢谢你的帮助!!