首页 文章

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

提问于
浏览
0

在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和#3之间对窗口小部件(甚至整个文档无法在窗口小部件级别进行)进行任何更新,我正在寻找的是一种取消STEP#3更新的简洁方法 .

2 回答

  • 0

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

    • 更新小部件(如果不需要,则更新整个小部件) .

    • 使用 lock 从一个代码位置更新文档的某些部分,以确保多个线程不会同时更新文档的相同部分(肯定会成为瓶颈) .

    • 设计数据库以避免同时更新文档的相同部分 .

    如果您需要交易 - 使用关系数据库 . 原子更新在文档数据库中是一件很新鲜的事情,许多文档数据库只能加载和保存文档 .

    但是,例如,RavenDB支持事务,但事务(特别是多个服务器之间)通常会杀死可伸缩性 . Mongodb目标 - 可扩展性,这意味着再见ACID和交易 .

    Eventual consistency在mongodb:

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

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

    只需确保使用正确的工具完成任务 .

    希望这可以帮助 .

  • 0

    同样的问题发布在这里:

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

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

相关问题