我已在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”和其他一些无效的修改