Mongodb C#代码使用2级,3级和4级数组

时间:2012-10-12 12:46:00

标签: c#-4.0 mongodb mongodb-.net-driver

我必须使用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条记录就在那里。

有什么办法可以用来表示数组索引值吗?请解释如何解决这个问题。请用例子解释我。

1 个答案:

答案 0 :(得分:0)

根据您上面的示例,我对您的架构的理解如下:

  • 顶级文档有BranchOffice字段
  • BranchOffice是一个对象数组
  • BranchOffice中的每个对象都有_idSubNameSubBranchlist字段
  • SubBranchlist是一个对象数组
  • SubBranchlist中的每个对象都有一个Name字段

您的更新语句似乎正在将SubName字段复制到NameSubBranchlist的兄弟字段)中的对象中的每个SubName字段。

使用属性路径语法通过数组选择字段(例如SubBranchlist.0.Name),没有“通配符”索引允许您修改数组中所有对象之间的Name字段。

在某种程度上相关的说明中,$ positional operator仅适用于第一个匹配的数组元素,因此您无法使用它来更新多个数组元素。在你的情况下,它无论如何都不是一个选项,因为你正在使用BranchOffice数组字段的位置运算符。

您可以发出一系列更新查询(针对SubBranchlist中的每个元素),或者考虑使用$set在一个查询中修改整个SubBranchlist数组。使用$set的缺点是您需要读取和写回整个数组,如果其他并发操作也向阵列发出更新,则可能会出现问题。