Обновление значений в двойном вложенном массиве на основе их значения - PullRequest
0 голосов
/ 29 октября 2019

Я изменил свою модель в MongoDB и хотел бы сделать запрос, который перезапишет всю коллекцию и изменит эти значения.

Моя основная цель - взять объект (BI) и переместить некоторые изего значения (a, b) для нового списка объекта. таким образом, у некоторых я мог бы быть больше экземпляров BI с более чем 1 комбо a, b. Поэтому на данный момент по умолчанию все мои значения a, b будут перемещены в новый размер списка 1. В будущем можно будет добавить в список больше значений a, b.

Объект BI долженможно изменить следующим образом: BI: {a, b, c, d, e} ---> BI: {[{a, b}], c, d, e}

Моя модель коллекции выглядит следующим образом:

A - верхний объект. A имеет массив с именем B типа X. B имеет массив с именем C типа Y. каждый объект Y имеет объект RS. каждый объект RS имеет объект BI. Я хотел бы взять некоторые значения BI и поместить их в новый массив (половина значений должна быть вставлена ​​в новый массив в первой позиции, а затем удалена из объекта BI.

, если янаписал бы это в коде, это выглядело бы примерно так:

foreach (Xtype x in A.B){  //B list might be null
   foreach (Ytype y in x.C){ // C list might be null
    if (y.RsValue!= null && y.RsValue.BiValue!= null){
         y.RsValue.BiValue.NewList = new List<someObject>();
         someObject o = new someObject(); // will contains a and b
         o.a = y.RsValue.BiValue.a;      //set its current value
         o.b = y.RsValue.BiValue.b;     // set its current value
         y.RsValue.BiValue.NewList[0] = o; //list with 1 item
         y.RsValue.BiValue.a = null; // delete this value from model
         y.RsValue.BiValue.b = null; // delete this value from model
     } 
  }
}

это должно происходить для каждого элемента в каждом документе с проверкой того, что ни один из них не является нулевым (каждый список и значение могут быть нулевыми)

Мне удалось, когда я попытался обновить 1 значение для каждого документа (без какого-либо списка) с помощью запроса foreach, например:

db.A.find({"RS.BI": {$ne: null}}).forEach(
function (elem){
 db.A.update(
  {
   _id: elem._id
  },
 {
    $set: {
    "RI.BI.NewList": 
    [{
               a: elem.RS.BI.a,
               b: elem.RS.BI.b, 
        }]
      }, 
    $unset: {
    "RI.BI.a": 1,
    "RI.BI.b": 1,
      },},
{multi: true}
);
     }
); 

, но когда я пробую его в двойных вложенных списках, я неЯ могу объединить этот метод с вставкой знака «$» и «[]» без каких-либо результатов. При попытке без запросов цикла foreach я не получаю никаких ошибок, но не могу получитьлюбой документ, который соответствует моему случаю.

Я пробовал это:

db.A.update(
{"B": { "$elemMatch": { "C": { "$ne": null } } }, 
"B.$[].C": {"$elemMatch": {"RS.BI": {"$ne": null} } }
},
{
"$set": {"B.$[].C.$[].RS.BI.NewList":
    [{
        a: "B.$[].C.$[].RS.BI.a",
               b: "B.$[].C.$[].RS.BI.b",
    }],
"$unset": {
"B.$[].C.$[].ReS.BI.a": 1,
"B.$[].C.$[].ReS.BI.b": 1,
 }
},
   { "multi": true }
)

Мои ожидаемые результаты:

Для каждого объекта BI, который не является нулевым, я хотел быпревратить это всписок объектов размером 1 со значениями a и b внутри и удаления значений a и b из объекта BI. Это должно позволить мне получить возможность иметь несколько значений a, b для каждого объекта BI.

Объект BI следует изменить следующим образом: BI: {a, b, c, d, e} ---> BI: {[{a, b}], c, d, e}

Редактировать:

Мне удалось получить доступ ко всем этим объектам BI и изменить их с помощью жестко заданных значений, например:

db.A.updateMany({Name:"Test on one document"},
  { $set: { 'B.$[element].V.$[element2].RS.BI.NewList': 
[{
    a: "a"
    b: "b"
}] 
} },
  { arrayFilters: [{ 'element.B': { $ne: null } },{'element2.RS.BI': {$ne: null}}] }
);

вместо "a" я попытался использовать "$ B. $ [Element] .V. $ [Element2] .RS.BI.a" или "B. $ [Element].V. $ [Element2] .RS.BI. $ A "и некоторые другие небольшие модификации, которые не работали

...