Mongoose中是否存在一行代码:不存在则保存,存在则不更新?
在Mongoose中实现「不存在则保存,存在则不更新」的一行代码
当然可以!要实现这个需求,你不需要复杂的逻辑,用Mongoose的updateOne()方法配合特定参数就能一行搞定:
await YourModel.updateOne({ /* 你的匹配条件,比如 { username: 'john_doe' } */ }, { $setOnInsert: { /* 要插入的文档内容 */ } }, { upsert: true });
关键参数解释:
upsert: true:这是核心开关——当查询条件匹配不到任何文档时,自动插入一条新文档;如果匹配到了,就执行后续的更新操作(但这里我们用了$setOnInsert,所以更新操作等于啥也没做)$setOnInsert:这个操作符的作用是只有在执行插入新文档的时候才会设置指定字段,如果文档已经存在,这个操作不会对现有文档做任何修改,完全符合你「存在则不更新」的要求
如果你更倾向于用findOneAndUpdate()(比如需要返回文档),也可以这么写:
const doc = await YourModel.findOneAndUpdate({ /* 匹配条件 */ }, { $setOnInsert: { /* 插入内容 */ } }, { upsert: true, new: false });
这里new: false表示如果文档存在,返回原文档;如果是新插入的,返回新创建的文档。
需要注意的是,如果你要插入的内容包含匹配条件本身(比如用唯一键匹配),也可以直接把匹配条件整合到$setOnInsert里,比如:
await User.updateOne({ email: 'user@example.com' }, { $setOnInsert: { email: 'user@example.com', name: 'John', age: 30 } }, { upsert: true });
这样既保证了匹配逻辑,又能在插入时设置完整的文档内容。
内容的提问来源于stack exchange,提问作者syl
相关产品推荐
相关产品推荐

