Я изменил свою модель в 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 "и некоторые другие небольшие модификации, которые не работали