Проверка нулевого значения Мангуста перед сохранением в массиве вложенных схем

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

У меня есть такая модель схемы:

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

В этом случае я получаю ошибку ValidationError из-за нулевого значения. Это ожидаемо. Но в следующих операциях:

 var obj = {properties: null}
account.objects.push(obj);
account.save(function(error, account) {
   //Error checking and response
})
  

Здесь значение сохраняется в базе данных, а затем у меня появляется неожиданное нулевое значение там, где оно было массивом. Выполнение этого с такими объектами,

 var obj = {
   properties: [{name:'randname'}, null]
}
  

Также сохраняет в базе данных значения null, которые запрещены для модели данных.

Я читал о валидаторах и промежуточном программном обеспечении для проверки вещей. Есть ли способ сделать это непосредственно в схеме, или я должен проанализировать полученный объект, прежде чем сохранить его в базе данных? Каков наилучший подход для этого?

Ответ №1:

Ну, вы могли бы просто использовать определения модели для этого. Даже если вы внедряете, вы все равно можете это сделать, но, конечно, вы не хотите фактически сохранять объекты в их собственной коллекции. Просто введите их в элемент как встроенные:

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

  });
  

Итак, что происходит, проверка будет работать для каждого этапа, в этом случае она завершится неудачей, если имя элемента схемы свойств не является строкой или даже если оно не включено.

Комментарии:

1. Спасибо за быстрый ответ! Я пробовал это, но случай, когда var obj = new ObjMod({ properties: null }); все равно вставляет null в базу данных. Есть способ решить эту проблему?

2. @Sugarl3ss в этом случае вы можете добавить другую проверку. Просто проблема, когда null тип не попадает в базовую проверку. Но дело в том, что если вы структурируете таким образом, то большинство ваших проблем должны исчезнуть без написания большого количества кода проверки.

3. Хорошо, тогда я добавлю несколько валидаторов для этих случаев.