Mongo更新意外插入文档

3
我有一个用C#编写的.NET应用程序,并使用Mongo作为数据库后端。我的其中一个集合UserSearchTerms会重复(无意中)创建重复文档。
我已经将问题分解到异步调用的更新函数上,并且可以同时多次调用。为了避免并发运行时出现问题,我使用更新实现了这段代码,触发与特定查询匹配的任何文档上的更新(唯一的用户和程序),如果没有找到文档,则进行插入操作。
最初,我可以保证不存在重复项,因此只会出现以下两种情况:
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上的用户 - 我对“唯一”文档的定义。
  • 我在事后返回计数以进行调试。
1个回答

1

虽然数据库索引可以防止重复插入,但这并不能解决为什么会首先插入的问题。我更想知道为什么会出现这种情况并修复它,因为这似乎是更正确的修复方式。 - Chumblechops
1
建议使用唯一索引:https://docs.mongodb.org/v2.6/reference/method/db.collection.update/#upsert-parameter - Louis F.
哦,好的!我不知道这是已知的行为 - 如果Mongo建议这样做,那么就是答案。谢谢! - Chumblechops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接