Mongoose findOneAndUpdate() 仅在文档已存在时更新,如果不存在则不创建新文档?
Posted
技术标签:
【中文标题】Mongoose findOneAndUpdate() 仅在文档已存在时更新,如果不存在则不创建新文档?【英文标题】:Mongoose findOneAndUpdate() only updates if document already exists, doesn't create new doc if not? 【发布时间】:2021-09-12 06:45:49 【问题描述】:我的 javascript 机器人遇到了问题,如果该服务器还没有自定义前缀,则不会保存我的自定义前缀,如果有,它会正确更新。
await mongo().then(async (mongoose) =>
try
let newprefix = content.replace(`$prefixsetprefix `, '')
await prefixSchema.findOneAndUpdate(_id: guild.id, _id: guild.id, prefix: newprefix)
.then(async () =>
console.log(`updated prefix for guild: $guild.id`)
await channel.send(`Succesfully updated prefix for this server to '$newprefix'`)
message.guild.me.setNickname(`[$newprefix] - Helix`)
)
.catch(async (err) =>
console.error(`failed to update prefix for guild: $guild.id\n$err`)
await channel.send(`Failed to update prefix.`)
)
console.log("saved to db")
catch
console.log("Something went wrong while saving new prefix for a server.")
finally
mongoose.connection.close()
机器人确实会打印并发送它已成功更新前缀,但如果还没有 guild.id 的文档,则不会保存任何内容。我做错了什么,我该如何解决?
感谢阅读!
【问题讨论】:
【参考方案1】:Model.updateOne()
参数
[options.upsert=false]
«Boolean» 如果为真,并且没有找到文档,则插入一个新文档
MongoDB 将只更新与过滤器匹配的第一个文档,而不管 multi 选项的值如何。 如果您想覆盖整个文档而不是使用像 $set 这样的原子操作符,请使用 replaceOne()。 示例:
const res = await Person.updateOne( name: 'Jean-Luc Picard' , ship: 'USS Enterprise' );
res.n; // Number of documents matched
res.nModified; // Number of documents modified
请访问https://mongoosejs.com/docs/api.html#model_Model.updateOne了解更多信息。
【讨论】:
以上是关于Mongoose findOneAndUpdate() 仅在文档已存在时更新,如果不存在则不创建新文档?的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose:findOneAndUpdate 不返回更新的文档
Mongoose - 使用 findOneAndUpdate 更新子文档
Mongoose `findOneAndUpdate` 回调不传递更新的文档
Mongoose `findOneAndUpdate` 回调不传递更新的文档