我有一个用C#编写的.NET应用程序,并使用Mongo作为我的数据库后端。我的一个集合UserSearchTerms反复(和无意)创建了重复的文档。
我已经将问题转移到异步调用的更新函数,并且可以同时调用多次。为了避免并发运行的问题,我使用了一个更新来实现此代码,我在任何与特定查询匹配的文档上触发(在用户和程序上是唯一的),如果没有找到文档,则会进行挂起。
最初,我可以保证不存在重复项,因此预计只会发生以下两种情况:
鉴于这两种情况,我希望通过此函数无法插入重复文档 - 应该插入新文档的唯一情况是,如果没有可以开始的话。然而,过了一个多小时,我发现即使存在特定用户/程序对的文档,也会创建新文档。
我是否正确实施此更新以确保不会创建重复的文档?如果没有,为了确保这一点,实施更新的正确方法是什么?
这是有问题的功能:
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);
}
其他信息:
答案 0 :(得分:1)
您可以在userId和programId上添加唯一索引,以确保不会插入重复项
Doc:https://docs.mongodb.org/v2.4/tutorial/create-a-unique-index/