【问题标题】:RavenDb importing data from different sources like xml, cvsRavenDb 从 xml、cvs 等不同来源导入数据
【发布时间】:2013-04-29 15:37:03
【问题描述】:

我们有一个可以导入大量数据的系统。 数据可以带有不同类型的 xml 文件,并且现在映射到 c# 对象。现在我们希望通过名称(这将是唯一的,但不会是 Id)更新按名称定位的现有对象,或者如果没有匹配的名称则创建新文档。

我们怎样才能以最有效的方式完成这项工作?

【问题讨论】:

    标签: c# ravendb document-database


    【解决方案1】:

    如果您不关心检查是否存在,那么您可以发送Bulk Insert

    除此之外,您还需要通过Name 加载每一个(因为我假设它是独一无二的,正如您所说)。

    像这样..

    using (var documentSession = documentStore.OpenSession())
    {
        // We are doing an import, so allow us to do LOTS of queries to the db.
        documentSession.Advanced.MaxNumberOfRequestsPerSession = int.MaxValue;
    
        foreach (var foo in newFoosToImport())
        {
            var existingFoo = documentSession
                .Query<Foo>()
                .SingleOrDefault(x => x.Name == foo.Name);
    
            if (existingFoo == null)
            {
                // Doesn't exist, so just save this new data.
                documentSession.Store(foo);
            }
            else
                // Map the required new data to the existing object.       
                MapNewDataToExistingObject(foo, existingFoo);
    
                // Now save the existing.
                documentSessionStore(existingFoo);           
            }
        }
    
        // Commit these changes.
        documentSession.SaveChanges();
    }
    

    此代码方法的另一种替代方法是通过批处理Names 来减少到数据库的往返次数。这意味着,您将名称列表传递给Where 子句。所以也许通过 10 或 30 Names。如果存在,则更新这些记录,否则插入。

    现在,如果您有一个大型数据集,您可以考虑批量处理您的 SaveChanges

    例如。

    if (storeCount % 1024 == 0)
    {
        documentSession.SaveChanges();
    }
    

    所以每 1024 个 Stores,然后是 SaveChanges。不确定这是否有帮助,但这是一个想法。 (提示:如果这样做,请确保在循环之后还有一个 SaveChanges,以便提交循环中的最后一组数据)。

    【讨论】:

    • 嗯,这就是它现在的工作方式,我一直在寻找更有效的解决方案。好像不是:(。
    • 查看批量上传的文档。它-可以-在存储之前进行更新检查。但我不确定更新检查条件是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多