使用C#的MongoDB“如果当前更新”嵌入式数组项

时间:2011-07-14 20:55:32

标签: mongodb mongodb-.net-driver

在MongoDB中,使用C#驱动程序,如果嵌入式数组的元素自首次检索以来尚未更改,则如何才能替换该元素。实质上,这将是嵌入式数组元素的“更新当前”。

例如,假设在STEP#1中我检索了以下文档:

{
  "_id": {
    "$oid": "4defe15e2a66bc11986859bb"
  },
  "widgets": [
    {
      "_id": "12312312",
      "views": 3,
      "comments": 7
    },
    {
      "_id": "567567FF",
      "views": 0,
      "comments": 1
    },
    {
      "_id": "890TT890",
      "views": 2,
      "comments": 8
    }
  ],
  "dtcreate": "Wed, 08 Jun 2011 16:53:51 GMT -04:00",
}

然后在STEP#2中,我提取了小部件“12312312”的对象并对其进行了一些更改,因此更新的小部件是:

    {
      "_id": "12312312",
      "views": 5,
      "comments": 9
    }

现在在STEP#3中,我使用位置运算符仅更新文档中的这个特定小部件。

这里的一切都运作良好,但唯一的问题是我不知道STEP#1和STEP#3之间的小部件“12312312”是否发生了另一次更新。

如果在#1和#1之间对小部件(甚至整个文档无法在小部件级别进行)进行任何更新,我正在寻找的是一种取消STEP#3更新的简洁方法#3。

2 个答案:

答案 0 :(得分:0)

避免并发更新的更好方法是:

  1. 更新小部件(如果不需要,则更新整个小部件)。
  2. 使用lock从一个代码位更新文档的某些部分,以确保多个线程不会同时更新文档的相同部分(肯定会成为瓶颈)。
  3. 设计数据库,以避免同时更新文档的相同内容。
  4. 如果您需要交易 - 请使用关系数据库。原子更新在文档数据库中是一件很新鲜的事情,许多文档数据库只能加载和保存文档。

    但是,例如,RavenDB支持事务,但事务(特别是在多个服务器之间)通常会破坏可伸缩性。 Mongodb目标 - 可扩展性,即再见ACID和交易。

    mongodb中的

    Eventual consistency

      

    MongoDB依赖于最终的一致性,而不是严格的一致性。那   意味着,当写入发生并且写入命令返回时,我们不能   从那个时刻开始,100%肯定所有其他进程   将仅查看更新的数据。他们最终只能做到   看到变化。这会影响缓存,因为我们无法使其无效   立即重新填充我们的缓存,但同样,在Web应用程序中重新填充它们   如果更新需要几秒钟才能传播

    ,这通常不是什么大问题

    因此,如果您没有使用mongodb开始开发,您可以查看其他数据库。

    请确保使用正确的工具完成任务。

    希望这有帮助。

答案 1 :(得分:0)

同样的问题发布在这里:

http://groups.google.com/group/mongodb-user/browse_thread/thread/888f5e14145d9f0c#

当讨论在一个地方合并时,它通常效果最好。