Коллекция 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 для сохранения.