仅当MongoDB中尚不存在新文档时如何插入新文档

时间:2015-07-18 05:53:45

标签: mongodb

我有一组具有以下架构的用户:

{
_id:ObjectId("123...."),
name:"user_name",
field1:"field1 value",
field2:"field2 value",
etc...
}

用户通过user.name查找,该用户名必须是唯一的。添加新用户后,我首先执行搜索,如果找不到这样的用户,我会将新用户文档添加到集合中。搜索用户和添加新用户的操作(如果没有找到)不是原子操作,因此当多个应用程序服务器连接到数据库服务器时,有可能同时接收两个add_user请求用户名,导致没有为add_user请求找到这样的用户,这反过来导致两个文档具有相同的“user.name”。实际上这发生了(由于客户端上的一个错误),只有一个应用服务器运行NodeJS并使用异步库。

我正在考虑使用findAndModify,但这不起作用,因为我不是简单地更新已经存在并且可以使用upsert但是想要插入的文档的字段(存在或不存在)仅当搜索条件失败时才会生成新文档。我不能使查询不等于“user.name”,因为它会找到其他用户。

1 个答案:

答案 0 :(得分:1)

首先,您应该在users集合的name字段中维护unique索引。如果您使用的是Mongoose或使用以下语句,则可以在架构中指定:

collection.ensureIndex('name', {unique: true}, callback);

这将确保名称字段保持唯一,并将解决您在问题中指定的并发请求问题。设置此索引时不需要搜索。

相关问题