如果已存在具有相同姓名的人,如何防止多个goroutines在人员集合中插入文档?
type Person struct {
Id bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
LastName string `bson:"lastName"`
}
我正在使用带有mgo驱动程序的Mongo for go语言。
如果有一个同名和姓氏的文件我尝试在插入之前找到但是我不认为这两个goroutine同时检查时覆盖了整个案例。我尝试通过两个字段(name, lastName)
确保索引,但它也没有帮助。
答案 0 :(得分:3)
如果已经存在具有相同名称和姓氏的人员,如何防止多个 goroutines / process / thread / applications /...在人员集合中插入文档
阻止重复输入的唯一方法。在并发环境中使用{name:1, lastname:1}
上的unique index。然后在您的代码中,您应该准备好优雅地处理潜在冲突引发的异常。
从不 check-before-insert ,因为在MongoDB中你没有交易,因此很可能一个记录被同时插入检查之后和插入之前的其他客户。
其他人可能肯定会使用正确的Go语法帮助您,但是以下代码(从here借用)的某些内容将允许您创建所需的索引:
index := mgo.Index{
Key: []string{"name", "lastName"},
Unique: true,
}
err = c.EnsureIndex(index)
然后,每次插入文档时,都需要使用mgo.isDup
函数来测试错误是否由重复键引起。作为之前answer by @elithrar的一个例子:
err := users.Insert(user) // where user is type *mgo.Collection
if err != nil {
if mgo.IsDup(err) {
// Is a duplicate key, but we don't know which one
}
// Is another error
}