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

9

我正在生产环境中运行一个使用MongoDB和Mongoose的NodeJS应用程序,其中包含一个类似于以下代码的Mongoose Schema:

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

现在,作为一个新的要求,我正在本地将一个新的属性添加到模式中,如下所示:

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在进程重新启动后自动添加缺失的属性。
2个回答

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

这是因为mongoose的 default 属性只适用于新文档。有两个解决方法:
  • 编写代码以将没有 isPublic 属性的文档视为 true
  • 或者,如上所述,通过mongodb控制台手动设置属性。

0

你最好使用MongoSH。向Mongoose Schema添加新属性将不会更新现有文档,除非程序员这样做。

在Mongo Shell(MongoSH)中使用updateMany命令:

// Get all documents in the collection, and set the field to a value
db.users.updateMany( {} , 
    { $set: {"newlyCreatedField": "defaultValue"} }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接