当前位置: 首页 > 知识库问答 >
问题:

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

习华灿
2023-03-14

我有一个具有以下模式的用户集合:

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

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

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

共有1个答案

沈长恨
2023-03-14

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

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

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

 类似资料:
  • 我在用弹性搜索和Nest库。我想知道当文档存在时,如何将文档批量插入ElasticSearch而不更新?

  • 主要内容:insert() 与 save() 方法,insertOne() 方法,insertMany() 方法前面我们已经介绍了如何在 MongoDB 中 创建数据库和 创建集合,接下来我们再来介绍一下如何在集合中插入文档。文档是 MongoDB 中数据的基本单位,由 BSON 格式(一种计算机数据交换格式,类似于 JSON)的键/值对组成。 insert() 与 save() 方法 您可以使用 MongoDB 中的 insert() 或 save() 方法向集合中插入文档,语法如下: db.

  • 我有以下文件在蒙戈收藏- 我想将此文档添加到Mongo,只有当具有,和值的类似文档中不存在时。 如果确实存在类似的文档,我希望仅更新timesSeen(递增1)和lastSeen(设置今天的日期)值。 这样做的正确和最有效的方法是什么?我是否可以使用一个命令来执行此操作,而无需在之前搜索相关文档并插入新文档/根据该命令更新现有文档

  • 我需要向MongoDB插入一个文档并返回新插入的文档。我用了db。集合(“集合名称”)。insertOne(“要插入的数据”)。然后((res)= 错误:未定义ops。 insertOne只返回插入文档的_id,而不是整个文档☹ 但早些时候,它通常返回整个文档。我使用了mongoclient而不是mongoose,在mongoose中它返回整个文档,但我不喜欢使用mongoose。

  • 我试图实现的很简单。只有当数据库不存在时,我才需要在数据库中创建一个用户条目。 应用程序流程: 使用Firebase身份验证(获取UID)创建用户 客户端代码(创建操作): firestore规则: 附加信息: 正如您可能已经知道的那样,代码不起作用。每次我运行客户端代码时,当前用户都会被一个新文档完全替换。但是,如果我从规则中删除以下行,一切都会正常工作: 但现在问题来了,如何保护用户文档中的数

  • 如何将最新文档插入(一个独立的、没有RS的)MongoDb,而不是现有的集合? 如何在文档之后插入所有文档?