Mongoose 是否有办法在一次查询中查询文档并在文档不存在时创建新文档?

Does Mongoose have a way to query for documents and create new ones if they don't exist, all in one query?

我想知道如何更新 MongoDB 中的 collection。基本上,我想获取一个电子邮件地址列表,检查它们是否存在于数据库中,如果不存在,则从它们创建一个新用户,所有这些都在同一个查询中。这可能吗?

现在我正在这样做:

const usersWithEmailsOnly = [<array-of-emails];

User.update({
   email: {
      $in: usersWithEmailsOnly.map(userWithEmail => userWithEmail.email),
   },
}, { multi: true, upsert: true }).exec()

我从服务器得到了这个响应:

{ ok: 0, n: 0, nModified: 0 }

当我查看数据库时,我发现没有创建任何用户。我还需要做些什么吗?

你想要bulkWrite()

Users.bulkWrite(
  usersWithEmailsOnly.map(userWithEmail =>
    ({ 
      "updateOne": {
        "filter": { "email": userWithEmail.email },
        "update": { "$setOnInsert": { "name": userWithEmail.name } },
        "upsert": true
      }
    })
  )
)

这与 $setOnInsert 更新运算符相结合,它具有指定参数的特殊条件 在实际 [=58 时更新文档=] 发生了。因此,当这是唯一使用的运算符时,匹配的现有文档不会收到任何更改。

请注意,"upserts" 将始终应用更新语句的 query/predicate 部分中使用的条件,只要表达式等于奇异值;即 age: { $gt: 3 } 不会是 单数 。对于大多数 "data loading",您通常希望创建静态谓词作为 "unique key",因此更新的选择器为以及 一些 其他数据,您可以根据需要在其中应用 $setOnInsert

从技术上讲,它仍然是多次更新,但与尝试在代码中循环一系列更新不同,这是对服务器的单个请求和响应。从您的应用程序的角度来看,它几乎具有与 单次写入 相同的响应能力(当然还有负载开销)。

没有真正的 "single statement",因为要更新的数据的不同标准不能应用于 MongoDB 更新中的多个文档.您可以应用 same 数据来更新多个文档,但是当您需要 "this condition to match a document also means I update with this specific data when that happens" 时,您就可以使用 bulkWrite() 为.