繁体   English   中英

如何使用C#驱动程序更新MongoDB中数组子文档中包含的数组子文档中的字段?

[英]How to update a field in an array's subdocument contained in an array's subdocument in MongoDB using C# driver?

我在MongoDB中有一个文档集合,其结构如下(有多个容器文档,每个包含Sessions ,每个会话包含1个Order,每个Order包含多个Items):

{
  "Sessions" : [{
      "ID" : "1882a092-d395-45d1-b36b-e2fa3df81b95",
      "Order" : {
        "Items" : [{
            "_id" : "a9c94a5e-10ef-433d-9c63-f4555eb7c2a7",
            "Title" : "UPDATE THIS",
          }]
      }
    }],
  "_id" : "1b640bc4-fdb4-49b1-9c60-e4c6f1bd0405"
}

我想在知道项目的_id的同时更新会话中订单中给定Item Title (如果有帮助,我也知道会话的ID):

我尝试过以下方法:

col.Update(Query.EQ("Sessions.ID", sessionID),
                Update.Set("Sessions.$.Order.Items.Title", newTitle));

col.Update(Query.EQ("Sessions.Order.Items._id", id),
                Update.Set("Sessions.Order.Items.$.Title", newTitle));

两者都抛出异常WriteConcern detected an error 'cannot use the part (Sessions of Sessions.Order.Items.0.Status) to traverse the element ... 我还尝试使用Query.And组合查询的不同组合,这可能没那么值得他们在这里发布。

如何使用C#驱动程序更新文档数组中包含的子文档中的字段?

我意识到单独使用位置运算符不能做到这一点(并且位置运算符不会神奇地匹配内部数组)。

我正在寻找开箱即用的解决方案如何在不更改架构的情况下完成此类更新。

您没有更新子文档的子文档。 您正在更新父数组子文档中的数组子文档的一个字段。

您可以通过代码更新来更新第一个元素

col.Update(Query.EQ("Sessions.ID", sessionID),
                Update.Set("Sessions.$.Order.Items.0.Title", newTitle));

使用简单的更新查询,您无法更新所有元素的标题。 此链接可能对您有帮助(使用自定义JavaScript更新查询)

如何在MondoDB中多次更新嵌套数组?

来自@Disposer的回答帮助我找到了解决方案。 它在我的代码库中传播了多个区域,但我想与可能有类似问题的其他人分享基本要点。

这些是步骤:

  • 锁定给定的订单,不允许将项目添加到其中(在应用程序级别)。
  • 或者,使用另外的WriteCount字段和使用findAndModify的组合,只有在此期间尚未更新文档时才会原子更新文档(“如果当前更新”)。

然后,在更新给定项目的Title时:

  • 使用存储的WriteCount
  • 确定项目索引
  • 将项索引与位置运算符结合使用: $来标识会话,一个用于定位项的整数index ,同时使用WriteCount字段使用“如果当前更新”策略。

然后更新部分变为:

"Sessions.$.Order.Items." + index + ".Title"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM