C# Mongo更新无意中插入文档

C# Mongo更新无意中插入文档,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我有一个用C#编写的.NET应用程序,并使用Mongo作为我的数据库后端。我的一个收藏UserSearchTerms反复(无意)创建了重复的文档 我已经解决了一个更新函数的问题,该函数可以异步调用,并且可以同时调用多次。为了避免并发运行的问题,我使用了一个更新来实现这段代码,该更新在匹配特定查询(在用户和程序上是唯一的)的任何文档上触发,如果找不到文档,则升级 最初,我可以保证不存在重复的情况,因此预计只会发生以下两种情况: 不存在匹配的文档,将触发upsert以添加新文档 存在一个匹配文档,

我有一个用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);
}
public int UpdateSearchTerm(UserSearchTerm项)
{
_userSearches=_uow.Db.GetCollection(“UserSearchTerms”);
var query=query.And(query.EQ(ust=>ust.UserId,item.UserId),query.EQ(ust=>ust.ProgramId,item.ProgramId));
_userSearches.Update(查询,Update.Replace(item),new-MongoUpdateOptions{Flags=UpdateFlags.Upsert});
return(int)_userSearches.Count(query);
}
其他信息:

  • 我使用的是mongod版本2.6.5
  • 我使用的mongocsharpdriver版本是1.9.2
  • 我正在运行.NET4.5
  • UserSearchTerms是我存储这些文档的集合
  • 该查询旨在匹配userId和programId(我对“唯一”文档的定义)上的用户
  • 出于调试目的,我在事实之后返回一个计数

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


Doc:

数据库索引确实可以防止插入重复项,但这并不能解决为什么要首先插入的问题。我想知道为什么会发生这种情况并修复它,因为这似乎是更正确的修复方法。建议使用唯一索引:哦,好的!我不知道这是已知的行为——如果Mongo推荐,那就是答案。谢谢