2016-04-29 2 views
0

Мне нужно вставить записи в две коллекции. Вторая коллекция хранит идентификатор записей первой коллекции. Это 1: м (fisrt: вторая) ситуация. Триггер является вторым сбором:Mongoose: вставьте одну коллекцию, опираясь на другую с обещаниями

  1. Если запись для второго сбора необходимо хранить
  2. проверить, если уже есть подходящая запись в первой коллекции
  3. если нет: сохраните один в первая коллекция
  4. магазин второй сборник
  5. сохранить идентификатор записи первой коллекции во второй коллекции

Следующий пример, похоже, выполняет эти шаги. Но у меня есть обещания только наполовину. Как это можно сделать более «обещанным» способом?

saveObjects(name: String, objects: Array<IObject>){ 

     var promise = FirstModel.findOne({Name : name}).exec(); 
     promise.then(function(res1){ 
      if (!res1){ 
       var la = new FirstModel(); 
       la.Name = name; 
       la.save(function(err){ 
        if (err) throw err; 
       }) 
      } 
     }).error(function(err){ 
      throw err; 
     }) 

     objects.forEach(function(obj) { 
      FirstModel.findOne({Name : name},'_id',function(err, res2){ 
       if (err) throw err; 

       var vo = new SecondModel(); 
       vo.Name = name; 
       vo.FistID = res2._id; 

       vo.save(function(err){ 
        if (err) throw err; 
       }); 
      }); 
     }); 

} 

ответ

0

Я Гон предположит, что вы используете Блюберд или другое обещание эквивалент создать.

var Promise = require('bluebird'); 
saveObjects(name: String, objects: Array <IObject>) { 

    // Get the first model 
    return FirstModel 
     .findOne({ 
      Name: name 
     }) 
     .exec() 
     .then(function (res1) { 
      if (!res1) { 
       var la = new FirstModel(); 
       la.Name = name; 
       return la.save() // We return the save operation on the model, save() returns a promise 
      } 

      // We just return the model normally so it passes down the chain. 
      return res1; 
     }) 
     .then(function (res1) { 
      // Here we use Promise.all() method on bluebird which accepts an Array 
      // of promises, we create a promise from the objects array by using Array.map() which 
      // goes through every object in the array and creates a new array. 
      return Promise 
       .all(objects.map(function (obj) { 
        // We go through each object in objects and create a new 
        // model and return the save() method of each model, this 
        // creates a array of promises which are resolved when each 
        // all model has been saved. 
        var vo = new SecondModel(); 
        vo.Name = name; 
        vo.FistID = res1._id; 

        return vo.save(); 
       })); 
     }) 
     .then(function (models) { 
      // here we have all the models we just saved in an array called models, 
      // do what you want with it. 
     }) 
     .error(function (err) { 
      throw err; 
     }) 
} 

Для получения дополнительной информации обратитесь к документации по Array.map() here и Promise.all() here

+0

Но ссылка 'vo.FistID = res1._id;' к FirstModel, бросает anerror в приведенном выше примере, так как res1._id не в область в. then part. Вот почему я прочитал дальше FirstModel в этом месте. Есть лучший способ сделать это ? – MBushveld

+0

res1 определяется во втором, затем(), поэтому он должен работать нормально. Мы передаем res1 от первого, затем() ко второму. Если вы получаете ошибку, вставьте его здесь, чтобы я мог видеть, что это такое. Если вы копируете/вставляете напрямую, вы должны знать, что я просто исправил незначительную синтаксическую ошибку, поэтому вам следует попробовать еще раз. – grimurd

+0

Ошибка, которую я получаю: 'error TS2339: свойство '_id' не существует в типе '{}'. 'Кажется, это для меня, что res1 не знает во второй части. – MBushveld

Смежные вопросы