Как добавить новое значение ключа или изменить значение ключа во вложенном массиве в MongoDB? - PullRequest
0 голосов
/ 26 декабря 2018

Ниже приведены те же данные 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, но не внутри него.Пожалуйста, поделитесь любым решением

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Это будет работать для меня Вы можете попробовать это

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})                                   

                     } 
} } });
0 голосов
/ 26 декабря 2018

Вы можете воспользоваться синтаксисом $[<identifier>] ( оператора позиционной фильтрации ) с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...