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()
为.
我想知道如何更新 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()
为.