Mongoose:添加新的 Schema 属性并更新所有当前文档

Posted

技术标签:

【中文标题】Mongoose:添加新的 Schema 属性并更新所有当前文档【英文标题】:Mongoose: Add new Schema property and update all current documents 【发布时间】:2014-12-09 23:18:10 【问题描述】:

我在生产中使用了一个使用 MongoDB 和 Mongoose 运行的 NodeJS 应用程序,它内部有一个 Mongoose Schema,例如:

var Product = new Schema(
    "name":  type: String, required: true 
  , "description":  type: String 
);

现在,作为一项新要求,我要在本地向 Schema 添加一个新属性,如下所示:

var Product = new Schema(
    "name":  type: String, required: true 
  , "description":  type: String 
  , "isPublic":  type: Boolean, default: true 
);

当我重新启动 NodeJS 进程时,我期待更新所有当前文档(产品),所以现在每个文档都有一个属性 isPublic,其值为 true

发生的事情是没有文档具有该新属性,如果我执行someProduct.Save( isPublic: true ),它将被添加。

问题:有没有办法做到这一点? 我知道我可以使用 mongo 客户端从命令行执行 $set,但我想知道 Mongoose 是否可以在进程重新启动时更改架构后添加缺少的属性。

【问题讨论】:

【参考方案1】:

发生的事情是没有文档具有该新属性,如果我执行someProduct.Save( isPublic: true ),它就会被添加。

这是因为 mongoose default 属性仅适用于新文档。有两种解决方法:

编写代码,将没有isPublic 属性的文档视为true; 或者,如上所述,通过 mongodb 控制台手动设置属性。

【讨论】:

以上是关于Mongoose:添加新的 Schema 属性并更新所有当前文档的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose

mongoose添加属性问题

schema中的虚拟属性方法

MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`

在 Mongoose Schema 中使用 _id 作为属性类型时出错

Mongoose — 使用聚合创建具有 $sum 的新属性