RavenDB处理特定类型的所有文档
我在更新集合中的所有文档时遇到一些问题。我需要做的是:我需要迭代大约200万个文档,将每个文档加载到内存中,解析文档中某个字段的HTML,然后将文档保存回数据库 我尝试了带/不带索引但Id等的take/skip逻辑,但有些记录仍然保持不变(甚至测试了1000条记录,一页中有128条记录)。在更新文档的过程中,不会插入更多记录。简单修补(修补API)不适用于此,因为我需要执行的更新非常复杂 请帮忙。谢谢 代码:RavenDB处理特定类型的所有文档,ravendb,nosql,Ravendb,Nosql,我在更新集合中的所有文档时遇到一些问题。我需要做的是:我需要迭代大约200万个文档,将每个文档加载到内存中,解析文档中某个字段的HTML,然后将文档保存回数据库 我尝试了带/不带索引但Id等的take/skip逻辑,但有些记录仍然保持不变(甚至测试了1000条记录,一页中有128条记录)。在更新文档的过程中,不会插入更多记录。简单修补(修补API)不适用于此,因为我需要执行的更新非常复杂 请帮忙。谢谢 代码: publicstaticintupdateall(documentstoredocdb
publicstaticintupdateall(documentstoredocdb,actionupdateAction)
{
返回UpdateAll(0,docDB,updateAction);
}
公共静态int-UpdateAll(int-startFrom、DocumentStore-docDB、Action-updateAction)
{
使用(var session=docDB.OpenSession())
{
int queryCount=0;
int start=startFrom;
while(true)
{
var current=session.Query().Take(128).Skip(start).ToList();
如果(current.Count==0)
打破
开始+=当前的计数;
foreach(当前的var单据)
{
更新(doc);
}
session.SaveChanges();
查询计数+=2;
如果(查询计数>=30)
{
返回UpdateAll(start、docDB、updateAction);
}
}
}
返回1;
}
移动您的会话。保存更改()代码>到while循环外部
根据Raven的会话设计,在会话的任何给定实例中,您只能与数据库进行30次交互
如果您使用
块对代码进行重构,使每个只保存一次(或很少几次),那么它应该可以工作。
有关更多信息,请查看Raven文档:您做了什么?请显示代码。已添加代码。我在这里找到了这个示例代码:并对其进行了一些更新
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;
}