mongodb Mongoose将strict设置为false将禁用验证

ryevplcw  于 2023-08-04  发布在  Go
关注(0)|答案(1)|浏览(123)

我有以下模式

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
yr9zkbsy

yr9zkbsy1#

经过一些尝试,我想出了一个解决方案,确实工作。我把它贴在这里,如果任何未来的 Mongoose 用户遇到同样的问题。
技巧是在Mongoose文档上使用save方法。出于某种原因,这确实可以正确地运行验证器,同时还允许使用strict选项。
因此,更新文档的基本过程如下所示:

  • 使用Model.findOne查找文档
  • 将更新应用于文档(例如,通过合并现有文档中的更新值)
  • 对文档调用save

在代码中:

// Find the document you want to update
    Model.findOne({name: "Me"}, function(error, document) {
        if(document) {
            // Merge the document with the updates values
            merge(document, newValues);

            document.save(function(saveError) {
                // Whatever you want to do after the update
            });
        }
        else {
            // Mongoose error or document not found....
        }
    });

    // Merges to objects and writes the result to the destination object.
    function merge(destination, source) {
        for(var key in source) {
            var to = destination[key];
            var from = source[key];

            if(typeof(to) == "object" && typeof(from) == "object")
                deepMerge(to, from);
            else if(destination[key] == undefined && destination.set)
                destination.set(key, from);
            else
                destination[key] = from;
        }
    }

字符串

相关问题