2016-10-06 4 views
0

Я пытаюсь реализовать метод 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 строк. Затем он вставляется успешно. Не может ли он автоматически генерировать автоматически увеличивающийся идентификатор?

+0

Я имел аналогичные проблемы с 2.x серии водителя. Моим решением было удалить поле Id из моего объекта POCO и применить к классу атрибут [BsonIgnoreExtraElements]. Это будет работать в большинстве случаев, поскольку в большинстве ситуаций поле Id не требуется, поэтому лучше всего позволить Mongo обрабатывать его автоматически. – shev72

ответ

1

Да есть, проверить this answer

Я не могу видеть, что происходит в BuildQueryByKey. Но вам действительно нужно выяснить, какой документ ваш код отправляет команде FindAndUpdate.

Просто распечатайте свой запрос и обновите vars, чтобы узнать, что происходит.

EDIT: для автогенераторного _id, просто удалите его из документа ;-) Или установить его на нуль и добавить [BsonIgnoreIfDefault] атрибут

+0

Это не работает для меня, потому что у меня нет коллекции. FindOneAndUpdateAsync, я думаю, потому что мне нужно использовать более старую версию драйвера Mongo (1.9.2). Я также обновил свой вопрос с более подробной информацией о запросе. – K48

 Смежные вопросы

  • Нет связанных вопросов^_^