Я пытаюсь реализовать метод Upsert в C# с использованием драйвера MongoDB 1.9.2 для .NET.Повторяющийся ключ _id при попытке обновить запись в MongoDB
Идея состоит в том, чтобы передать объект методу; если объект уже существует в MongoDB, обновите данные во всех столбцах; если он не существует, то создайте новый документ в MongoDB.
У моего объекта есть член по имени id
. Если мой метод получает объект, который не имеет набора id
, то в MongoDB создается новая запись, как и ожидалось.
Однако, если у него есть id
, например, "2", он бросает это исключение вместо обновления значений:
Команда 'findAndModify' не удалось: исключение: insertDocument :: вызванные : : 11000 E11000 повторяющийся индекс ошибки ключа: XXXXXXXX.MyObjectClassName. $ ID DUP ключ: {: 2} ...
Вот как метод выглядит следующим образом:
public override void Save(TModel modelObject)
{
MongoServer server = ConnectMongo();
var database = server.GetDatabase(ModelDatabaseName);
// custom method that determines which column is the key column for this type of object, e.g. "id" or "requestID" or "taskID"
var query = BuildQueryByKey(modelObject);
var update = Update<TModel>.Replace(modelObject);
MongoCollection collection = database.GetCollection<TModel>(mWriteCollectionName);
FindAndModifyArgs args = new FindAndModifyArgs()
{
Upsert = true, //update if exists, otherwise insert
Query = query,
Update = update,
VersionReturned = FindAndModifyDocumentVersion.Modified
//Fields =
};
var result = collection.FindAndModify(args);
}
После исследования на StackOverflow, я обнаружил, что некоторые люди решали проблему, добавив атрибут [BsonIgnoreIfDefault]
в столбец id в определении объекта, но это ничего не изменило для меня.
Любые идеи, что я делаю неправильно? Существует ли какая-либо примерная реализация для FindAndModify для обновления или вставки объекта в MongoDB?
Обновление: Я получил его для работы (частично), создав запрос вручную, вместо использования моего собственного метода. Таким образом, пользовательский метод возвращал запрос, который искал id=2
, и получается, что мне нужно было _id=2
.
Итак, обновление работает сейчас, но вставить нет. Вместо автоматического генерации _id, Mongo, похоже, ожидает, что я передам следующий идентификатор, например. «8», если у меня уже есть 7 строк. Затем он вставляется успешно. Не может ли он автоматически генерировать автоматически увеличивающийся идентификатор?
Я имел аналогичные проблемы с 2.x серии водителя. Моим решением было удалить поле Id из моего объекта POCO и применить к классу атрибут [BsonIgnoreExtraElements]. Это будет работать в большинстве случаев, поскольку в большинстве ситуаций поле Id не требуется, поэтому лучше всего позволить Mongo обрабатывать его автоматически. – shev72