根据其值更新双嵌套数组中的值

时间:2019-10-29 15:17:51

标签: mongodb mongo-shell mongodb4.0

我已在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具有名为Y的类型为C的数组。 每个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
     } 
  }
}

应该在每个文档中的每个项目都发生这种情况,并检查它们是否都不为空(每个列表和值都可以为空)

当我尝试使用如下所示的foreach查询为每个文档(没有任何列表)更新1值时,我就成功了:

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

我的预期结果是:

对于每个不为null的BI对象,我希望将其放入大小为1的对象列表中,其中包含a和b值,并从BI对象中删除a和b值。 这应该让我可以选择让每个BI对象具有多个a,b值。

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}}] }
);
我尝试使用“ $ B。$ [element] .V。$ [element2] .RS.BI.a”或“ B。$ [element] .V。$ [element2]”代替

.RS.BI。$ a”和其他一些无效的修改

0 个答案:

没有答案