RavenDb从xml,cvs等不同来源导入数据

时间:2013-05-05 21:26:05

标签: c# ravendb document-database

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

我们如何以最有效的方式实现这一目标?

1 个答案:

答案 0 :(得分: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来减少到db的往返次数。这意味着,您将名称列表传递给Where子句。所以也许可以通过10或30 Names。如果存在,则更新这些记录,否则插入。

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

例如

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

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

HTH。