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

本文关键字:xml cvs 数据 导入 RavenDb | 更新日期: 2023-09-27 18:12:18

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

我们怎样才能以最有效的方式做到这一点?

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

如果你不关心是否存在,那么你可以做一个大容量插入。

除此之外,您还需要通过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,以便提交循环中的最后一组数据)。