【发布时间】:2019-04-12 04:30:00
【问题描述】:
在 Mongoose 中,我正在寻求以原子方式执行 Model.FindOne-Or-Insert(),与当前可用的 Model.FindOneAndUpdate() 类似的功能和签名,除非存在实例(即匹配 filter)然后 不要使用提供的更新object 但返回找到的实例原样,如果不存在(即与filter 不匹配)则插入object 并返回新实例。
我找不到使用Model.FindOneAndUpdate() 不执行更新现有实例的方法,方法是尝试对其options 的差异并且不向object 提供如果实例存在则不希望更新的字段。
所以,我当前的非原子解决方法是Model.FindOne(),如果找不到,则执行Document.save()。
const Foo = DB.model('foo', FooSchema)
async function findOneAndUpdateFoo(jsonFoo, next) {
const filter = {
deletedAt: null
}
if (jsonFoo.dsAccountId) {
filter.dsAccountId = jsonFoo.dsAccountId
}
if (jsonIntegration.dsUserId) {
filter.dsUserId = jsonIntegration.dsUserId
}
if (jsonFoo.providerId) {
filter.providerId = jsonFoo.providerId
}
const fooDoc = {
name: jsonFoo.name,
dsAccountId: jsonFoo.dsAccountId,
dsUserId: jsonFoo.dsUserId,
providerId: jsonFoo.providerId,
providerName: jsonFoo.providerName,
// Most of these fields could be empty
accessToken: jsonFoo.accessToken,
refreshToken: jsonFoo.refreshToken,
scope: jsonFoo.scope,
tokenType: jsonFoo.tokenType,
expiresAt: jsonFoo.expiresAt
}
return await Foo.findOneAndUpdate(
filter, // find a document with that filter
fooDoc, // document to insert when nothing was found
{ upsert: true, new: true, runValidators: true } // options
)
.catch(next)
}
建议?谢谢
【问题讨论】:
-
@JohnnyHK 感谢您的及时回复。我已经使用 Model.FindOneAndUpdate() 更新了我的问题显示代码。我现在正在查看您的建议。