【问题标题】:How to add new key value or change the key's value inside a nested array in MongoDB?如何在 MongoDB 的嵌套数组中添加新的键值或更改键的值?
【发布时间】:2018-12-26 01:52:29
【问题描述】:

以下是相同的MongoDB数据:

{  
   "_id":{  
      "$oid":"5c228169e8cab71a7132c82b"
   },
   "param1":"ABC",
   "param2":[  
      {  
         "aid":{  
            "$oid":"5c228169e8cab7139d10aca7"
         },
         "param3":"DEF",
         "param4":[  
            {  
               "lid":{  
                  "$oid":"5c2281685ee3358440f9412f"
               },
               "param5":"GHI"
            },
            {  
               "lid":{  
                  "$oid":"5c22816d5ee3358440f941bb"
               },
               "param5":"JKL"
            },
         ]
      },
      {  
         "aid":{  
            "$oid":"5c22819de8cab71a7d6db75d"
         },
         "param3":"MNO",
         "param4":[ 
            {  
               "lid":{  
                  "$oid":"5c2281735ee3358440f9428a"
               },
               "param5":"QRS"
            },
            {  
               "lid":{  
                  "$oid":"5c2281795ee3358440f9431a"
               },
               "param5":"TUV"
            }
         ]
      }
   ]
}

问题: 如何在 param4 数组列表中更改值或添加任何新的键值对,例如是否需要将 "param5":"JKL" 更改为 "param5":"XYZ" 或添加新的键值将"param6":"Hello""param5":"JKL" 配对,这样成员数组就会变成:

{  
   "lid":{  
      "$oid":"5c22816d5ee3358440f941bb"
    },
   "param5":"JKL"
   "param6":"Hello"
}

我检查了不同的解决方案,但所有解决方案都达到了 param4 的阶段,但不在其中。请分享任何解决方案

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以利用$[<identifier>] (positional filtered operator) 语法和arrayFilters

    更新param5

    db.col.update(
        { _id: { "$oid":"5c228169e8cab71a7132c82b" } }, 
        { $set: { "param2.$[cond1].param4.$[cond2].param5": "XYZ" } }, 
        { arrayFilters: [ { "cond1.aid.$oid": "5c228169e8cab7139d10aca7" }, { "cond2.lid.$oid": "5c22816d5ee3358440f941bb" } ]  })
    

    同样,您可以使用$set 添加新密钥 - param6

    【讨论】:

    • 解决方案在 Mongo shell 中工作,php mongodb 客户端等效查询代码抛出错误:未捕获的 MongoDB\Driver\Exception\InvalidArgumentException:“arrayFilters”选项具有 BSON 数组的无效键。我正在努力弄清楚。
    • 让它在 php mongodb 客户端查询代码中也能工作。
    【解决方案2】:

    这对我有用 你可以试试这个

    db.collection.find({"_id.oid": "5c228169e8cab71a7132c82b"}).forEach(function(ele){
       for(var i = 0; i < ele.param2.length; i++){
            var prm4=ele.param2[i].param4;             
                  for(var j = 0; j < prm4.length; j++){
                       if(prm4[j].param5 == "JKL") 
                        {
                                    var data = {};
                                    data["param2." + i.toString() + ".param4."+j.toString()+ ".param5"]="XYZ"
                                    data["param2." + i.toString()+ ".param4."+j.toString()+ ".param6"]="Hello"
    
                                    db.collection.update({ "_id.oid": "5c228169e8cab71a7132c82b"},{$set:data})                                   
    
                         } 
    } } });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多