在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。
答案 0 :(得分:0)
避免并发更新的更好方法是:
lock
从一个代码位更新文档的某些部分,以确保多个线程不会同时更新文档的相同部分(肯定会成为瓶颈)。如果您需要交易 - 请使用关系数据库。原子更新在文档数据库中是一件很新鲜的事情,许多文档数据库只能加载和保存文档。
但是,例如,RavenDB支持事务,但事务(特别是在多个服务器之间)通常会破坏可伸缩性。 Mongodb目标 - 可扩展性,即再见ACID和交易。
mongodb中的MongoDB依赖于最终的一致性,而不是严格的一致性。那 意味着,当写入发生并且写入命令返回时,我们不能 从那个时刻开始,100%肯定所有其他进程 将仅查看更新的数据。他们最终只能做到 看到变化。这会影响缓存,因为我们无法使其无效 立即重新填充我们的缓存,但同样,在Web应用程序中重新填充它们 如果更新需要几秒钟才能传播
,这通常不是什么大问题
因此,如果您没有使用mongodb开始开发,您可以查看其他数据库。
请确保使用正确的工具完成任务。
希望这有帮助。
答案 1 :(得分:0)
同样的问题发布在这里:
http://groups.google.com/group/mongodb-user/browse_thread/thread/888f5e14145d9f0c#
当讨论在一个地方合并时,它通常效果最好。