RavenDB处理某种类型的所有文档

时间:2014-07-02 08:32:15

标签: ravendb nosql

我在更新集合中的所有文档时遇到了一些问题。我需要做的是:我需要迭代~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;
}

1 个答案:

答案 0 :(得分:0)

将您的session.SaveChanges();移至while循环之外。

根据Raven的会话设计,在任何给定的会话实例中,您只能与数据库进行30次交互。

如果您将代码重构为每个using块一次(或非常少)的SaveChanges(),它应该可以正常工作。 有关更多信息,请查看Raven文档:Understanding The Session Object - RavenDB