Mongo更新无意中插入文档
Mongo Update Unintentionally Inserting Document
我有一个用 C# 编写的 .NET 应用程序,并使用 Mongo 作为我的数据库后端。我的 collection 之一 UserSearchTerms 反复(无意地)创建了重复的文档。
我已经解决了异步调用的更新函数的问题,并且可以同时调用多次。为了避免并发运行出现问题,我使用更新来实现此代码,我会在匹配特定查询(在用户和程序上唯一)的任何文档上触发该更新,如果没有找到文档则更新。
最初,我可以保证不存在重复项,因此预计只会出现以下两种情况:
- 不存在匹配的文档,触发upsert添加新文档
- 存在一个匹配文档,因此仅在该文档上触发更新
考虑到这两种情况,我预计没有办法通过此函数插入重复文档 - 唯一应该插入新文档的时间是如果有 none 开头。然而一个多小时后,我发现即使存在特定 user/program 对的文档,也会为它们创建新文档。
我是否正确实施了此更新以保证不会创建重复的文档?如果不是,实施更新以确保这一点的正确方法是什么?
这是有问题的函数:
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 就是 collection 我把这些文档存进去了。
- 该查询旨在匹配 userId 和 programId 上的用户 - 我对 'unique' 文档的定义。
- 我 return 事后计数以用于调试目的。
您可以在 userId 和 programId 上添加唯一索引,以确保不会插入重复项
文档:https://docs.mongodb.org/v2.4/tutorial/create-a-unique-index/
我有一个用 C# 编写的 .NET 应用程序,并使用 Mongo 作为我的数据库后端。我的 collection 之一 UserSearchTerms 反复(无意地)创建了重复的文档。
我已经解决了异步调用的更新函数的问题,并且可以同时调用多次。为了避免并发运行出现问题,我使用更新来实现此代码,我会在匹配特定查询(在用户和程序上唯一)的任何文档上触发该更新,如果没有找到文档则更新。
最初,我可以保证不存在重复项,因此预计只会出现以下两种情况:
- 不存在匹配的文档,触发upsert添加新文档
- 存在一个匹配文档,因此仅在该文档上触发更新
考虑到这两种情况,我预计没有办法通过此函数插入重复文档 - 唯一应该插入新文档的时间是如果有 none 开头。然而一个多小时后,我发现即使存在特定 user/program 对的文档,也会为它们创建新文档。
我是否正确实施了此更新以保证不会创建重复的文档?如果不是,实施更新以确保这一点的正确方法是什么?
这是有问题的函数:
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 就是 collection 我把这些文档存进去了。
- 该查询旨在匹配 userId 和 programId 上的用户 - 我对 'unique' 文档的定义。
- 我 return 事后计数以用于调试目的。
您可以在 userId 和 programId 上添加唯一索引,以确保不会插入重复项
文档:https://docs.mongodb.org/v2.4/tutorial/create-a-unique-index/