mongodb 是一个比较灵活的数据库,可以不先定义好每个字段类型,就可以实现文档插入。今天要实现一个功能,需要在单条 document 里没有isNew字段的情况下,新增isNew字段。当我调用Article.updateOne({ _id: id }, { isNew: true })时,发现数据库无法插入成功。

mongoose 提供了多种更新文档的 api,比如Model.findOneAndUpdate()Model.findByIdAndUpdate()Model.updateMany()Model.updateOne()等等 api 都尝试了一遍,结果还是不尽人意。🤯

最终定位的原因 mongoose 的 Schema 对象如果未定义,就无法实现动态新增字段。

值得注意点是,mongoose 在新增 document 的时候没有这限制,如果 Schema 没有定义,还是可以正常插入。

最后解决的方法,在定义 Schema 对象里新增要修改的字段即可。

const ArticleSchema = new mongoose.Schema({
...
isNew: { type: Boolean, default: false },
})