我在更新集合中的所有文档时遇到了一些问题。我需要做的是:我需要迭代~200万个文档将每个文档加载到内存中,从文档的某个字段解析HTML并将文档保存回DB。
我尝试使用/不使用索引但使用Id等获取/跳过逻辑但是一些记录仍然保持不变(甚至测试了1000条记录,页面中有128条记录)。在更新文档的过程中,不再插入记录。简单的修补(修补API)对此不起作用,因为我需要执行的更新非常复杂
请帮助解决这个问题。感谢
代码:
public static int UpdateAll<T>(DocumentStore docDB, Action<T> updateAction)
{
return UpdateAll(0, docDB, updateAction);
}
public static int UpdateAll<T>(int startFrom, DocumentStore docDB, Action<T> updateAction)
{
using (var session = docDB.OpenSession())
{
int queryCount = 0;
int start = startFrom;
while (true)
{
var current = session.Query<T>().Take(128).Skip(start).ToList();
if (current.Count == 0)
break;
start += current.Count;
foreach (var doc in current)
{
updateAction(doc);
}
session.SaveChanges();
queryCount += 2;
if (queryCount >= 30)
{
return UpdateAll(start, docDB, updateAction);
}
}
}
return 1;
}
答案 0 :(得分:0)
将您的session.SaveChanges();
移至while循环之外。
根据Raven的会话设计,在任何给定的会话实例中,您只能与数据库进行30次交互。
如果您将代码重构为每个using
块一次(或非常少)的SaveChanges(),它应该可以正常工作。
有关更多信息,请查看Raven文档:Understanding The Session Object - RavenDB