1

我是 RavenDB 的新手,真的可以使用一些帮助。

我有大约 20M 文档的集合,我需要为每个文档添加一个键。挑战在于密钥的值需要从另一个文档中导出。

例如,给定以下文档:

{
    "Name" : "001A"
    "Date" : "09-09-2013T00:00:00.0000000"
    "Related" : [
        "002B",
        "003B"
    ]
}

目标是通过在集合中查找相关文档并返回其日期来添加一个保存相关文档日期的键,即 002B 和 003B。例如:

{
    "Name" : "001A"
    "Date" : "09-09-2013T00:00:00.0000000"
    "Related" : [
        "002B",
        "003B"
    ]
    "RelatedDates" : [
        "08-10-2013T00:00:00.0000000",
        "08-15-2013T00:00:00.0000000"
    ]
}

我意识到我正在尝试将集合视为关系数据库,但这是我的数据开始时的形式。我不希望首先将所有内容都放入关系数据集中,以便为 RavenDB 构建数据。

我首先尝试在客户端执行此操作,方法是对集合进行分页并更新记录。但是,我很快就达到了会话的最大请求数。

然后我尝试使用 JavaScript 在服务器端进行修补,但我不确定这是否可行。

在这一点上,我将非常感谢有关解决此问题的正确方法的一些战略指导,以及有关如何实施它的更多战术指导。

4

1 回答 1

1

推荐的方法是通过一个循环遍历所有记录的控制台应用程序,类似于您已经完成的操作,但以分页数据的方式,这样您就不会达到每个会话的最大请求数。

请参阅ravendb 源代码示例应用程序中的此示例:

你需要做这样的事情:

using (var store = new DocumentStore { ConnectionStringName = "RavenDB" }.Initialize())
        {
            int start = 0;
            while (true)
            {
                using (var session = store.OpenSession())
                {
                    var posts = session.Query<Post>()
                        .OrderBy(x => x.CreatedAt)
                        .Include(x => x.CommentsId)
                        .Skip(start)
                        .Take(128)
                        .ToList();

                    if (posts.Count == 0)
                        break;

                    foreach (var post in posts)
                    {
                        session.Load<PostComments>(post.CommentsId).Post = new PostComments.PostReference
                        {
                            Id = post.Id,
                            PublishAt = post.PublishAt
                        };
                    }

                    session.SaveChanges();
                    start += posts.Count;
                    Console.WriteLine("Migrated {0}", start);
                }
            }
        }

我已经用大约 150 万条记录完成了这种事情,而且迁移速度并不快。如果您的记录很小,那么您可以只加载<>,并且SaveChanges根据经验以编程方式修补文档并没有显着加快速度

作为旁注,如果您想从工作室专门询问有关这样做的问题, ravendb google 组非常活跃

于 2013-09-19T22:48:26.133 回答