我有一个具有以下架构的用户集合:
{
_id:ObjectId("123...."),
name:"user_name",
field1:"field1 value",
field2:"field2 value",
etc...
}
通过user.name查找用户,该名称必须是唯一的。添加新用户时,我首先执行搜索,如果找不到该用户,则将新用户文档添加到集合中。搜索用户和添加新用户(如果未找到)的操作不是原子操作,因此,当多个应用程序服务器连接到数据库服务器时,有可能同时接收到两个add_user请求,并且请求相同用户名,导致在两个add_user请求中都找不到这样的用户,从而导致两个文档具有相同的“ user.name”。实际上,这是由于客户端错误导致的,因为只有一台运行NodeJS并使用Async库的应用服务器。
我当时在考虑使用findAndModify,但是这行不通,因为我不是简单地更新已经存在并且可以使用upsert的文档的字段(存在或不存在),而是想插入一个新文档仅当搜索条件失败时。我无法使查询不等于“ user.name”,因为它将找到其他用户。
首先,您应该unique
在users集合的name字段上维护索引。如果您使用Mongoose或使用以下语句,则可以在模式中指定它:
collection.ensureIndex('name', {unique: true}, callback);
这将确保name字段保持唯一,并将解决您在问题中指定的并发请求问题。设置此索引时,您不需要搜索。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句