0

我必须使用 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);
    }
}

这里是第 2 级数组,我使用(for loop 语句)来获取数组的索引值。接下来我可以使用第 3、第 4 和第 5 级数组意味着将分配超过(for 循环语句)。所以不需要[for循环语句],也不需要在索引中分配核心编号。 For example: ("BranchOffice.$.SubBranchlist.0.Name",subBranch.SubName). 这里 Don't Hardcore number[index] 0 或 1 或 2。有超过 100 条记录的“2nd”级数组。

有什么方法可以用来排列索引值吗?请解释如何解决这个问题。请用示例向我解释。

4

1 回答 1

0

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

  • 顶级文档有一个BranchOffice字段
  • BranchOffice是一个对象数组
  • 其中的每个对象BranchOffice都有一个_id,SubNameSubBranchlist字段
  • SubBranchlist是一个对象数组
  • 里面的每个对象SubBranchlist都有一个Name字段

您的更新语句似乎将字段复制到(的同级字段)内的对象之间SubName的每个字段。NameSubBranchlistSubName

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

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

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

于 2012-10-12T17:04:13.900 回答