根据其他文档的值向RavenDB文档添加键值(对于大型集合中的所有文档)

时间:2013-09-19 22:26:07

标签: ravendb

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

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

例如,给出以下文件:

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

目标是通过查找集合中的相关文档并返回其日期来添加保存相关文档日期的密钥,即002B和003B。 E.g:

{
    "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修补服务器端,但我不确定这是否可行。

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

1 个答案:

答案 0 :(得分:1)

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

请参阅ravendb源代码示例应用程序中的this example

你需要做这样的事情:

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

我已经完成了大约1.5M记录的这种事情,并且进行迁移并不是很快。如果您的记录很小,那么您只需加载&lt;&gt;并且每个人都有SaveChanges,因为从编程方式修补文件的经验并没有大大加快工作速度

作为旁注,ravendb google groups非常活跃,如果你想特别询问从工作室这样做的话