RavenDB处理特定类型的所有文档

RavenDB处理特定类型的所有文档,ravendb,nosql,Ravendb,Nosql,我在更新集合中的所有文档时遇到一些问题。我需要做的是:我需要迭代大约200万个文档,将每个文档加载到内存中,解析文档中某个字段的HTML,然后将文档保存回数据库 我尝试了带/不带索引但Id等的take/skip逻辑,但有些记录仍然保持不变(甚至测试了1000条记录,一页中有128条记录)。在更新文档的过程中,不会插入更多记录。简单修补(修补API)不适用于此,因为我需要执行的更新非常复杂 请帮忙。谢谢 代码: publicstaticintupdateall(documentstoredocdb

我在更新集合中的所有文档时遇到一些问题。我需要做的是:我需要迭代大约200万个文档,将每个文档加载到内存中,解析文档中某个字段的HTML,然后将文档保存回数据库

我尝试了带/不带索引但Id等的take/skip逻辑,但有些记录仍然保持不变(甚至测试了1000条记录,一页中有128条记录)。在更新文档的过程中,不会插入更多记录。简单修补(修补API)不适用于此,因为我需要执行的更新非常复杂

请帮忙。谢谢

代码:

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;
}