我有一个用C#编写的.NET应用程序,并使用Mongo作为数据库后端。我的其中一个集合UserSearchTerms会重复(无意中)创建重复文档。
我已经将问题分解到异步调用的更新函数上,并且可以同时多次调用。为了避免并发运行时出现问题,我使用更新实现了这段代码,触发与特定查询匹配的任何文档上的更新(唯一的用户和程序),如果没有找到文档,则进行插入操作。
最初,我可以保证不存在重复项,因此只会出现以下两种情况:
1.不存在匹配的文档,触发插入以添加新文档。
2.存在一个匹配的文档,因此只对该文档触发更新。
基于这两种情况,我期望通过此功能不可能插入重复文档,唯一插入新文档的时间是在开始时没有文档。但是,在一小时左右的时间内,即使为特定的用户/程序对存在文档,也会创建新文档。
我是否正确地实现了此更新以保证不会创建重复文档?如果没有,请问保证此操作的正确方法是什么?
以下是相关函数:
我已经将问题分解到异步调用的更新函数上,并且可以同时多次调用。为了避免并发运行时出现问题,我使用更新实现了这段代码,触发与特定查询匹配的任何文档上的更新(唯一的用户和程序),如果没有找到文档,则进行插入操作。
最初,我可以保证不存在重复项,因此只会出现以下两种情况:
1.不存在匹配的文档,触发插入以添加新文档。
2.存在一个匹配的文档,因此只对该文档触发更新。
基于这两种情况,我期望通过此功能不可能插入重复文档,唯一插入新文档的时间是在开始时没有文档。但是,在一小时左右的时间内,即使为特定的用户/程序对存在文档,也会创建新文档。
我是否正确地实现了此更新以保证不会创建重复文档?如果没有,请问保证此操作的正确方法是什么?
以下是相关函数:
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和programId上的用户 - 我对“唯一”文档的定义。
- 我在事后返回计数以进行调试。