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` 回调不传递更新的文档

Mongoose:findOneAndUpdate 不适用于多种条件

Mongoose findOneAndUpdate 更新多个字段