Коллекция MongoDB C#.Сохранить vs вставить + обновить

из C# документация:

метод Save представляет собой комбинацию Insert и Update. Если член Id документа имеет значение, то предполагается, что он является существующим документом и сохраняет вызовы Update в документе (установка флага Upsert на случай, если это действительно новый документ).

Я создаю свои идентификаторы вручную в базовом классе, который наследуют все мои объекты домена. Таким образом, все мои объекты домена имеют ID, когда они вставить в MongoDB.

вопросы, должен ли я использовать коллекцию.Сохраните и сохраните мой интерфейс простым или это действительно приведет к некоторым накладным расходам в Save-call (с флагом Upsert), и я должен использовать коллекцию.Вместо Insert и Update?

Я думаю, что метод Save сначала вызывает Update, а затем выясняет, что мой новый объект не существовал в первую очередь, а затем вызывает Insert. Я ошибаюсь? Кто-нибудь проверял это?

Примечание: я вставляю массовые данные с InsertBatch, поэтому большие datachunks не будут иметь значения в этом случае.

редактировать, последующие

Я написал небольшой тест, чтобы узнать, имеет ли вызов Update с флагом Upsert некоторые накладные расходы, поэтому Insert может быть лучше. Оказалось, что они бегают с одинаковой скоростью. См. Мой ниже тестовый код. MongoDbServer и IMongoDbServer-это мой собственный универсальный интерфейс для изоляции хранилища.

IMongoDbServer server = new MongoDbServer();
Stopwatch sw = new Stopwatch();
long d1 = 0;
long d2 = 0;
for (int w = 0; w <= 100; w++)
{
    sw.Restart();
    for (int i = 0; i <= 10000; i++)
    {
        ProductionArea area = new ProductionArea();
        server.Save(area);
    }
    sw.Stop();
    d1 += sw.ElapsedMilliseconds;
    sw.Restart();
    for (int i = 0; i <= 10000; i++)
    {
        ProductionArea area = new ProductionArea();
        server.Insert(area);
    }
    sw.Stop();
    d2 += sw.ElapsedMilliseconds;
}
long a1 = d1/100;
long a2 = d2/100;

1 ответов


метод сохранения -не собираюсь сделать две поездки на сервер.

эвристика такова: если сохраняемый документ не имеет значения для поля _id, для него генерируется значение, а затем вызывается вставка. Если сохраняемый документ имеет ненулевое значение для _id, то обновление вызывается с флагом Upsert, и в этом случае сервер должен решить, делать ли вставку или обновление.

Я не знаю, если Upsert больше дороже, чем вставка. Я подозреваю, что они почти одинаковы, и что действительно важно, так это то, что в любом случае это одна сеть туда и обратно.

Если вы знаете, что это новый документ, вы можете также вызвать Insert. И вызов InsertBatch путь более эффективный, чем вызов многих отдельных вставок. Поэтому определенно предпочитаю InsertBatch для сохранения.