我有以下模式
var Schema = new mongoose.Schema({
type: {required: true, type: String, enum: ["device", "beacon"], index: true},
device: {
type: {type: String},
version: {type: String},
model: {type: String}
},
name: String,
beaconId: {required: false, type: mongoose.Schema.Types.ObjectId},
lastMeasuredTimestamp: {type: Number, index: true},
lastMeasuredPosition: {type: [Number], index: "2dsphere"},
lastMeasuredFloor: {type: Number, index: true}
}, {strict: false});
字符串
请注意,我已将strict设置为false。这是因为向文档中添加架构中未定义的自定义属性是有效的。
接下来我执行以下查询DB.Document.update({_id: "SOME_ID_HERE"}, {$set: {type: "bull"}}, {runValidators: true})
根据Mongoose架构,这将属性“type”更改为无效值。我使用runValidators选项来确保模式验证运行。
然而,该查询的最终结果是“type”被更改为“bull”,并且不运行验证。但是当我将strict设置为true时,验证确实运行,并且(正确地)显示错误。
为什么严格会影响是否运行验证?当我查看www.example.com的描述时http://mongoosejs.com/docs/guide.html#strict,它只提到严格限制添加模式中未定义的属性(对于这个特定的模式,我不希望这样)。
安装信息:
- Ubuntu 14.04 LTS
- MongoDB 3.0
- Mongoose 4.2.3
- NodeJS 0.10.25
- 国家预防机制1.3.10
1条答案
按热度按时间yr9zkbsy1#
经过一些尝试,我想出了一个解决方案,确实工作。我把它贴在这里,如果任何未来的 Mongoose 用户遇到同样的问题。
技巧是在Mongoose文档上使用
save
方法。出于某种原因,这确实可以正确地运行验证器,同时还允许使用strict选项。因此,更新文档的基本过程如下所示:
Model.findOne
查找文档save
。在代码中:
字符串