在保存嵌套模式数组之前进行Mongoose null检查

时间:2014-06-26 08:48:38

标签: node.js mongodb mongoose

我有一个像这样的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]
}

还会在数据库中保存禁止数据模型的空值。

我已经阅读过验证器和中间件来检查事物。反正是否有直接在架构上执行此操作,或者我必须在将其保存到数据库之前解析收到的对象?对此最好的方法是什么?

1 个答案:

答案 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 ) );

  });

所以会发生什么,验证将适用于每个阶段,在这种情况下,它将失败的属性架构项的名称不是字符串,甚至不包括。