У меня есть приложение .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 - моим определением уникального документа.
- Я возвращаю счет после факта для целей отладки.
Это правда, что индекс базы данных будет препятствовать дубликат от быть вставлены, но что не решило бы проблему того, почему в первую очередь встает вопрос. Я бы предпочел узнать, почему это происходит и исправить это, поскольку это похоже на более правильное исправление. – vavskjuta
Рекомендуется использовать уникальный индекс: https://docs.mongodb.org/v2.6/reference/method/db.collection.update/#upsert-parameter –
О, хорошо! Я не знал, что это было известное поведение - если Монго это рекомендует, тогда это ответ. Благодаря! – vavskjuta