我有一个像这样的Schema模型:
var propertySchema = new Schema({
name: {type: String, required: true},
surname: String
});
var objSchema = new Schema({
properties: [prepertySchema]
});
var accountSchema = new Schema({
objects: [objSchema]
});
mongoose.model('account', accountSchema);
然后我有了操作:
account.objects.push(null);
account.save(function(error, account) {
//Error checking and response
})
在这种情况下,我因为null值而得到ValidationError。这是预料之中的。但是,在接下来的行动中:
var obj = {properties: null}
account.objects.push(obj);
account.save(function(error, account) {
//Error checking and response
})
这里的值存储在数据库中,然后我有一个意外的空值,它就是一个数组。用这样的对象做到这一点,
var obj = {
properties: [{name:'randname'}, null]
}
还会在数据库中保存禁止数据模型的空值。
我已经阅读过验证器和中间件来检查事物。反正是否有直接在架构上执行此操作,或者我必须在将其保存到数据库之前解析收到的对象?对此最好的方法是什么?
答案 0 :(得分:2)
那么你可以使用模型定义。即使您正在嵌入,您仍然可以执行此操作,但当然您不希望将对象实际保存到自己的集合中。只需将它们作为嵌入项输入项目:
var async = require("async"),
mongoose = require("mongoose"),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/prop');
var propertySchema = new Schema({
name: { type: String, required: true },
surname: String
});
var objSchema = new Schema({
properties: [propertySchema],
});
var accountSchema = new Schema({
objects: [objSchema]
});
var Account = mongoose.model( 'account', accountSchema );
var ObjMod = mongoose.model( 'ObjMod', objSchema, null, false );
var PropMod = mongoose.model( 'PropMod', propertySchema, null, false );
var account = new Account();
var prop = new PropMod({ "name": null });
var obj = new ObjMod({ properties: prop });
account.objects.push( obj );
account.save(function(err,account) {
if (err) throw err;
console.log( JSON.stringify( account, undefined, 4 ) );
});
所以会发生什么,验证将适用于每个阶段,在这种情况下,它将失败的属性架构项的名称不是字符串,甚至不包括。