Mongo更新无意中插入文档

时间:2015-12-22 17:53:02

标签: c# .net mongodb mongodb-.net-driver

我有一个用C#编写的.NET应用程序,并使用Mongo作为我的数据库后端。我的一个集合UserSearchTerms反复(和无意)创建了重复的文档。

我已经将问题转移到异步调用的更新函数,并且可以同时调用多次。为了避免并发运行的问题,我使用了一个更新来实现此代码,我在任何与特定查询匹配的文档上触发(在用户和程序上是唯一的),如果没有找到文档,则会进行挂起。

最初,我可以保证不存在重复项,因此预计只会发生以下两种情况:

  • 不存在匹配的文档,触发upsert以添加新文档
  • 存在一个匹配的文档,因此仅在该一个文档上触发更新

鉴于这两种情况,我希望通过此函数无法插入重复文档 - 应该插入新文档的唯一情况是,如果没有可以开始的话。然而,过了一个多小时,我发现即使存在特定用户/程序对的文档,也会创建新文档。

我是否正确实施此更新以确保不会创建重复的文档?如果没有,为了确保这一点,实施更新的正确方法是什么?

这是有问题的功能:

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上的用户 - 我对“唯一”&#39;的定义。文档。
  • 为了调试目的,我在事后返回一个计数。

1 个答案:

答案 0 :(得分:1)

您可以在userId和programId上添加唯一索引,以确保不会插入重复项

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