2015-12-22 3 views
3

У меня есть приложение .NET, написанное на C#, и используйте Mongo для моей базы данных. Одна из моих коллекций UserSearchTerms, неоднократно (и непреднамеренно), создает дубликаты документов.Mongo Update Непреднамеренно Вставка документа

Я дразнил проблему функции обновления, которая вызывается асинхронно и может быть вызвана несколько раз одновременно. Чтобы избежать проблем с параллельными прогонами, я реализовал этот код с помощью обновления, которое я запускаю на любых документах, соответствующих конкретному запросу (уникальному для пользователя и программы), при условии, что документы не найдены.

Первоначально, я могу гарантировать, что не существует никаких дубликатов и поэтому ожидать, что только следующие два случая: не существует

  • Нет соответствующих документов, вызывая upsert добавить новый документ
  • Один соответствующий документ существует, и поэтому обновление запускается только на одном документе.

Учитывая эти два случая, я ожидаю, что не будет возможности для дублирования документов, которые будут вставляться через эту функцию - единственный раз, когда новый документ должен быть ины erted, если их нет для начала. Тем не менее, через час или около того я обнаружил, что даже если документы для определенной пары пользователь/программа существуют, для них создаются новые документы.

Правильно ли я внедряю это обновление, чтобы гарантировать, что дублирующие документы не будут созданы? Если нет, то каков правильный способ реализации обновления, чтобы обеспечить это?

Это функция вопрос:

public int UpdateSearchTerm(UserSearchTerm item) 
{ 
    _userSearches = _uow.Db.GetCollection<UserSearchTerm>("UserSearchTerms"); 
    var query = Query.And(Query<UserSearchTerm>.EQ(ust => ust.UserId, item.UserId), Query<UserSearchTerm>.EQ(ust => ust.ProgramId, item.ProgramId)); 

    _userSearches.Update(query, Update<UserSearchTerm>.Replace(item), new MongoUpdateOptions { Flags = UpdateFlags.Upsert }); 

    return (int)_userSearches.Count(query); 
} 

Дополнительная информация:

  • Я использую mongod версии 2.6.5
  • версия mongocsharpdriver я использую 1.9.2
  • Я работаю .NET 4.5
  • UserSearchTerms - это коллекция, в которой хранятся эти документы.
  • Запрос предназначен для соответствия пользователям как с идентификатором userId AND programId - моим определением уникального документа.
  • Я возвращаю счет после факта для целей отладки.

ответ

1

Вы можете добавить уникальный индекс USERID и programId, чтобы гарантировать, что дубликат не будет вставлен

Doc: https://docs.mongodb.org/v2.4/tutorial/create-a-unique-index/

+0

Это правда, что индекс базы данных будет препятствовать дубликат от быть вставлены, но что не решило бы проблему того, почему в первую очередь встает вопрос. Я бы предпочел узнать, почему это происходит и исправить это, поскольку это похоже на более правильное исправление. – vavskjuta

+1

Рекомендуется использовать уникальный индекс: https://docs.mongodb.org/v2.6/reference/method/db.collection.update/#upsert-parameter –

+0

О, хорошо! Я не знал, что это было известное поведение - если Монго это рекомендует, тогда это ответ. Благодаря! – vavskjuta

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