gpt4 book ai didi

node.js - Mongoose 将 strict 设置为 false 会禁用验证

转载 作者:可可西里 更新时间:2023-11-01 10:00:33 25 4
gpt4 key购买 nike

我有以下架构

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})

这会将属性“type”更改为根据 Mongoose 模式无效的值。我使用 runValidators 选项来确保模式验证运行。

然而,此查询的最终结果是“type”更改为“bull”并且未运行验证。但是,当我将 strict 设置为 true 时,验证确实运行并且(正确)显示错误。

为什么严格会影响验证是否运行?当我查看此描述时 http://mongoosejs.com/docs/guide.html#strict它只提到严格限制添加模式中未定义的属性(我不希望这个特定模式)。

安装信息:

  • Ubuntu 14.04 LTS
  • MongoDB 3.0.8
  • Mongoose 4.2.3
  • NodeJS 0.10.25
  • NPM 1.3.10

最佳答案

经过一些尝试,我想出了一个可行的解决方案。如果 future 的 Mongoose 用户遇到同样的问题,我会把它贴在这里。

诀窍是在 Mongoose 文档上使用 save 方法。出于某种原因,这确实可以正确运行验证器,同时还允许使用 strict 选项。

因此更新文档的基本过程如下所示:

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

在代码中:

    // 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;
}
}

关于node.js - Mongoose 将 strict 设置为 false 会禁用验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34333293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com