RavenDb импортирует данные из разных источников, таких как xml, cvs

У нас есть система, которая будет импортировать много данных. Данные могут поступать с различными типами XML-файлов и прямо сейчас отображаются на объекты C#. Теперь мы хотим по имени (которое будет уникальным, но не будет идентификатором) обновлять существующие объекты, которые расположены по имени, или создавать новые документы, если нет подходящего имени.

Как мы можем сделать это наиболее эффективным способом?

1 ответ

Если вы не заботитесь о проверке существующих, вы можете выполнить групповую вставку.

Кроме того, вам нужно будет загрузить каждый 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 после цикла, так что вы фиксируете последний набор данных в цикле.

НТН.

Другие вопросы по тегам