【问题标题】:Adding key value to RavenDB document based on another document's values (For all documents in large collection)根据另一个文档的值向 RavenDB 文档添加键值(对于大型集合中的所有文档)
【发布时间】:2013-09-20 06:57:29
【问题描述】:

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

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

【问题讨论】:

    标签: ravendb


    【解决方案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);
                    }
                }
            }
    

    我用大约 150 万条记录完成了这种事情,但迁移速度并不快。如果您的记录很小,那么您可以在每个记录上加载和SaveChanges,因为以编程方式修补文档的经验并没有显着加快速度

    附带说明,如果您想从工作室专门询问有关这样做的问题,ravendb google groups 非常活跃

    【讨论】:

    • 谢谢@wal 这非常有帮助,我认为答案。我将尝试在此基础上快速拼凑一些东西,看看是否有效。但是,乍一看,我超出会话请求限制的问题是固定的。
    • 嗯,它并不快,但它奏效了,这在这种情况下是最重要的。
    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-05-30
    • 2023-03-17
    • 2016-12-28
    • 2021-08-26
    • 2020-07-23
    相关资源
    最近更新 更多