在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 回答
避免并发更新的更好方法是:
更新小部件(如果不需要,则更新整个小部件) .
使用
lock
从一个代码位置更新文档的某些部分,以确保多个线程不会同时更新文档的相同部分(肯定会成为瓶颈) .设计数据库以避免同时更新文档的相同部分 .
如果您需要交易 - 使用关系数据库 . 原子更新在文档数据库中是一件很新鲜的事情,许多文档数据库只能加载和保存文档 .
但是,例如,RavenDB支持事务,但事务(特别是多个服务器之间)通常会杀死可伸缩性 . Mongodb目标 - 可扩展性,这意味着再见ACID和交易 .
Eventual consistency在mongodb:
因此,如果您没有使用mongodb开始开发,则可以查看其他数据库 .
只需确保使用正确的工具完成任务 .
希望这可以帮助 .
同样的问题发布在这里:
http://groups.google.com/group/mongodb-user/browse_thread/thread/888f5e14145d9f0c#
当讨论在一个地方合并时,它通常效果最好 .