我必须使用MongoDB更新C#代码。在这里,我在下面实现了第二级更新数组(subBranchindex在一个通用列表对象中): -
for (var index = 0; index < subBranchindex.Count; index++)
{
if (subBranchindex[index]._id == new ObjectId(subBranchid))
{
IMongoQuery queryEdit = Query.EQ("BranchOffice.SubBranchlist._id", new ObjectId(subBranchid));
UpdateBuilder update = Update.Set("BranchOffice.$.SubBranchlist."+ index +".Name",subBranch.SubName).
SafeModeResult s = dc.Collection.Update(queryEdit, update,
UpdateFlags.None, SafeMode.True);
}
}
这里是第二级数组,我使用(for循环语句)获取数组的索引值。接下来我可以使用第3级,第4级和第5级数组意味着多于(for loop语句)将被赋值。所以不需要[for loop Statement],也不需要在索引中分配硬核号码。
For example: ("BranchOffice.$.SubBranchlist.0.Name",subBranch.SubName)
。这里不要硬核号码[索引] 0或1或2.“第二”级别数组超过100条记录就在那里。
有什么办法可以用来表示数组索引值吗?请解释如何解决这个问题。请用例子解释我。
答案 0 :(得分:0)
根据您上面的示例,我对您的架构的理解如下:
BranchOffice
字段BranchOffice
是一个对象数组BranchOffice
中的每个对象都有_id
,SubName
和SubBranchlist
字段SubBranchlist
是一个对象数组SubBranchlist
中的每个对象都有一个Name
字段您的更新语句似乎正在将SubName
字段复制到Name
(SubBranchlist
的兄弟字段)中的对象中的每个SubName
字段。
使用属性路径语法通过数组选择字段(例如SubBranchlist.0.Name
),没有“通配符”索引允许您修改数组中所有对象之间的Name
字段。
在某种程度上相关的说明中,$ positional operator仅适用于第一个匹配的数组元素,因此您无法使用它来更新多个数组元素。在你的情况下,它无论如何都不是一个选项,因为你正在使用BranchOffice
数组字段的位置运算符。
您可以发出一系列更新查询(针对SubBranchlist
中的每个元素),或者考虑使用$set
在一个查询中修改整个SubBranchlist
数组。使用$set
的缺点是您需要读取和写回整个数组,如果其他并发操作也向阵列发出更新,则可能会出现问题。