gpt4 book ai didi

javascript - 如何在 Mongoose 中动态删除所需的验证

转载 作者:行者123 更新时间:2023-12-03 11:44:32 34 4
gpt4 key购买 nike

我已经创建了这个架构。大多数时候,我需要字段 v1 必须是必需的,但在特殊情况下,字段 v1 不需要它。我该怎么做?

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var MonographSchema = new Schema({
v1: {
type: String,
required: true,
trim: true
},
v3: [
{
_id: false,
_: String,
a: String,
b: String,
c: [String],
t: Number
}
]
});

mongoose.model('Monograph', MonographSchema);



var Monograph = mongoose.model('Monograph');

var monograph1 = new Monograph({
v1: '001ab',
v3: [
{'_': 'BR1.1', 'a': '1.00', 'b': 'T17a', 'c': ['v.1', 'e.2'], 't': '1001'},
{'_': 'BR67.1', 'a': '614.32', 'b': 'T17a', 'c': ['v.2'], 't': '25'},
{'b': 'T17a', 'c': ['v.2'], 't': '25'}
]
});

var monograph2 = new Monograph({
v3: [
{'_': 'BR1.1', 'a': '1.00', 'b': 'T17a', 'c': ['v.1', 'e.2'], 't': '1001'},
{'_': 'BR67.1', 'a': '614.32', 'b': 'T17a', 'c': ['v.2'], 't': '25'},
{'b': 'T17a', 'c': ['v.2'], 't': '25'}
]
});

monograph1.save(); //all fine
monograph2.save(); //I get an error

如何即时取消设置 v1required: true

最佳答案

好吧,也许不是“即时关闭”,但您可以只调用一种通用的 .update() 形式,而不是 .save() ,它确实不使用预保存 Hook 的验证:

  var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');

var MonographSchema = new Schema({
v1: {
type: String,
required: true,
trim: true
},
v3: [
{
_id: false,
_: String,
a: String,
b: String,
c: [String],
t: Number
}
]
});

mongoose.model('Monograph', MonographSchema);

var Monograph = mongoose.model('Monograph');
var monograph1 = new Monograph({
v1: '001ab',
v3: [
{'_': 'BR1.1', 'a': '1.00', 'b': 'T17a', 'c': ['v.1', 'e.2'], 't': '1001'},
{'_': 'BR67.1', 'a': '614.32', 'b': 'T17a', 'c': ['v.2'], 't': '25'},
{'b': 'T17a', 'c': ['v.2'], 't': '25'}
]
});

var monograph2 = new Monograph({
v3: [
{'_': 'BR1.1', 'a': '1.00', 'b': 'T17a', 'c': ['v.1', 'e.2'], 't': '1000'},
{'_': 'BR67.1', 'a': '614.32', 'b': 'T17a', 'c': ['v.2'], 't': '25'},
{'b': 'T17a', 'c': ['v.2'], 't': '25'}
]
});


async.series(
[
function(callback) {
Monograph.findByIdAndUpdate(
monograph1._id,
{ "$set": monograph1.toObject() },
{ "upsert": true },
function(err,doc) {
if (err) throw err;
console.log(JSON.stringify( doc, undefined, 2 ));
callback();
}
);
},
function(callback) {
Monograph.findByIdAndUpdate(
monograph2._id,
{ "$set": monograph2.toObject() },
{ "upsert": true },
function(err,doc) {
if (err) throw err;
console.log( JSON.stringify( doc, undefined, 2 ));
callback();
}
);
}
]
);

所以这两个调用都会正常工作:

{
"_id": "542a41389330a912140c20c9",
"v1": "001ab",
"__v": 0,
"v3": [
{
"_": "BR1.1",
"a": "1.00",
"b": "T17a",
"t": 1001,
"c": [
"v.1",
"e.2"
]
},
{
"_": "BR67.1",
"a": "614.32",
"b": "T17a",
"t": 25,
"c": [
"v.2"
]
},
{
"b": "T17a",
"t": 25,
"c": [
"v.2"
]
}
]
}
{
"_id": "542a41389330a912140c20ca",
"__v": 0,
"v3": [
{
"_": "BR1.1",
"a": "1.00",
"b": "T17a",
"t": 1000,
"c": [
"v.1",
"e.2"
]
},
{
"_": "BR67.1",
"a": "614.32",
"b": "T17a",
"t": 25,
"c": [
"v.2"
]
},
{
"b": "T17a",
"t": 25,
"c": [
"v.2"
]
}
]
}

因此“验证”和其他方法实际上“绑定(bind)”到 .save() 方法。如果您不使用它,则不会调用这些方法。哦,您可以要求从 .toObject() 调用中输出“虚拟”字段,因此如果您使用它,则无需丢失它。

因此,要么删除“required”属性可能是您最好的方法,但只要您更加小心,这是可能的:

async.series(
[
// Is valid anyway
function(callback) {
monograph1.save(function(err,doc) {
if (err) throw err;
console.log( JSON.stringify( doc, undefined, 2 ) );
callback();
});
},
// Remove the validators and replace
function(callback) {
var hold = monograph2.schema.paths.v1.validators;
monograph2.schema.paths.v1.validators = [];
monograph2.save(function(err,doc) {
if (err) throw err;
console.log( JSON.stringify( doc, undefined, 2 ) );
monograph2.schema.paths.v1.validators = hold;
callback();
});
},
// With validators will fail
function(callback) {
monograph2.save(function(err,doc) {
if (err) throw err;
console.log( JSON.stringify( doc, undefined, 2 ) );
callback();
});
}
]
);

这表明,如果您从正在使用的模式路径中删除“validators”数组,那么将不会进行检查。您可以只删除“必需的”验证器,但对于所呈现的模式,这是该路径上存在的唯一验证器。

必须小心,因为这是对模型附加架构的“全局”更改,并且在替换之前,验证器将被视为不存在。这也意味着您不是修改对象的“实例”,而是修改所有实例使用的附加对象。因此,虽然这是“关闭”的,但它是“到处都关闭的”吗?

所以真正的选择分为:

  1. 要么放弃其他字段的所有类型检查和验证。
  2. 一开始就接受该字段没有必需的属性。
  3. 接受操纵对象架构验证方法的危险

最终,您可以“暂时”删除此检查,但可能不会以您期望的方式删除,而且仅此一点就存在缺陷。

关于javascript - 如何在 Mongoose 中动态删除所需的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113032/

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