Ответ 1
Если вы перейдете на MongoDB 2.6, вы можете воспользоваться новыми массовыми операциями:
Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);
Похоже, MonogoDB не поддерживает пакетное обновление. Это верно?
Если нет, как бы вы решили добавить пакетный upsert с существующим API, который является наиболее эффективным? Поддерживает ли пакетный пакет даже смысл для mongo db?
Если вы перейдете на MongoDB 2.6, вы можете воспользоваться новыми массовыми операциями:
Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);
Существует утилита mongoimport с флагом upsert. Что-то вроде
mongoimport -c myitems -d mydb --upsert items.json
Может ли это достичь того, что вы ищете?
По умолчанию используется upsert на основе _id, но вы можете изменить это, используя флаг -upsertFields, зарегистрированный здесь.
http://docs.mongodb.org/manual/reference/mongoimport/#cmdoption-mongoimport--upsertFields
Для С# MongoDB.Driver я использую следующий:
var writeModels = new List<WriteModel<T>>();
foreach (var entity in list)
{
var id = entity.Id;
if (id == null)
{
writeModels.Add(new InsertOneModel<T>(entity));
}
else
{
var filter = new ExpressionFilterDefinition<T>(x => x.Id == id);
var replaceModel = new ReplaceOneModel<T>(filter, entity);
writeModels.Add(replaceModel);
}
}
await getCollection().BulkWriteAsync(writeModels);