2017-10-07 3 views
0

J'utilise la migration pour mettre à jour la position des messages en fonction des utilisateurs. Je veux dire que je vais interroger pour obtenir des utilisateurs de DB, donc de l'utilisateur, je reçois des messages et mettre à jour la position pour eux. J'utilise la séquence pour augmenter la position pour le messageComment attendre l'exécution de la requête avant de terminer la migration sur orientjs

Version 1: voir mon code ci-dessous

"use strict"; 
const async = require('async'); 

exports.name = "add position for message"; 
exports.up = function (db) { 
    return db.select('uuid').from('User').all().then(function(users) { 
    return users.forEach(function(user) { 
     console.log('each user', user.uuid); 
     db.query(`CREATE SEQUENCE positionMessage${user.uuid} TYPE ORDERED`); // SQL CREATE SEQUENCE 

     return db.query(`select uuid from Message where in('has_message').uuid = :userUuid`, { 
     params: { 
      userUuid: user.uuid 
     } 
     }) 
     .then(function(messages) { 
     console.log('messages', messages.length); // result => get full messages with 2500 messages. 
     return messages.forEach(function(message) { 
      console.log('message uuid', message.uuid); 
      return db.query(`UPDATE Message SET position = sequence('positionMessage${user.uuid}').next() where uuid = :uuid`, { 
      params: { 
       uuid: message.uuid 
      } 
      }) 
      .then(function(err) { 
      console.log(err); 
      }) 
     }) 
     }) 
    }) 
    }) 
}; 

exports.down = function (db) { 
    db.select('uuid').from('User').all().then(function(users) { 
    users.forEach(function(user) { 
     db.query(`DROP SEQUENCE positionMessage${user.uuid}`); // SQL DROP SEQUENCE 
    }) 
    }) 
    return db.query(`UPDATE Message REMOVE position`) 
}; 

==> Résultat: fini avec des messages est mis à jour. le compte est autour de 5-> 50 enregistrements est mis à jour. (Nombre de messages est dans DB: 2500)

J'ai essayé l'utilisation async chute d'eau, chaque ... voir mon code ci-dessous Version 2:

"use strict"; 
const async = require('async'); 

exports.name = "add position for message"; 
exports.up = function (db) { 

    return async.waterfall([ 
    function getUser(callback) { 
     return db.select('uuid').from('User').all().then(function(users) 
     { 
     callback(null, users); 
     }) 
    }, 
    function getMessageForUser(users, callback) { 
    //getMessageForUser 
    return async.each(users, function (user, callback) { 
     // run to async each users 
     db.query(`CREATE SEQUENCE positionMessage${user.uuid} TYPE ORDERED`); // SQL CREATE SEQUENCE 
     return db.query(`select uuid from Message where in('has_message').uuid = :userUuid`, { 
     params:{ 
      userUuid: user.uuid 
     } 
     }) 
     .then(function(messages) { 
     return async.each(messages, function(message, callback) { 
      // go to async each messages 
      return db.query(`UPDATE Message SET position = sequence('positionMessage').next() where uuid = ${message.uuid}`) 
      .then(function (response) { 
       // updated position for message 
       callback(); 
      }) 
     }, function doneEachMessage(err) { 
      //doneEachMessage 
      callback(err); 
     }) 
     }) 
    }, function doneEachUser(err) { 
     // doneEachUser 
     callback(err); 
     }) 
    } 
    ], function doneWaterFall(err) { 
    console.log('doneWaterFall'); 
    }) 
}; 

exports.down = function (db) { 
    db.select('uuid').from('User').all().then(function(users) { 
    users.forEach(function(user) { 
     db.query(`DROP SEQUENCE positionMessage${user.uuid}`); // SQL DROP SEQUENCE 
    }) 
    }) 
    return db.query(`UPDATE Message REMOVE position`) 
}; 

Résultat: => Rien ne se produisit .

version orientjs J'utilise est 2.2.6

Je ne sais pas ce que je fais mal. Quelqu'un peut-il m'aider pour une solution? Merci beaucoup!

Répondre

0

J'ai résolu mon problème en utilisant la fonction Promise. Le voici:

"use strict"; 
const async = require('async'); 

exports.name = "add position for message"; 
exports.up = function (db) { 
    return new Promise(function (resolve, reject) { 
    db.select('uuid').from('User').all().then(function(users) { 
     async.each(users, function(user, callback) { 
     console.log('VP - loop to update message for user has uuid: ', user.uuid); 
     db.query(`CREATE SEQUENCE positionMessage${user.uuid} TYPE ORDERED`); // SQL CREATE SEQUENCE 
     db.query(`select uuid, @rid as rid from Message where in('has_message').uuid = :userUuid`, { 
      params: { 
      userUuid: user.uuid 
      } 
     }) 
     .then(function(messages) { 
      console.log('VP - count messages need to update position: ', messages.length); 
      async.each(messages, function(message, callback) { 
      db.query(`UPDATE Message SET position = sequence('positionMessage${user.uuid}').next() where uuid = :uuid`, { 
       params: { 
       uuid: message.uuid 
       } 
      }) 
      .then(function(err) { 
       console.log('VP - Executed update position for message have uuid: ', message.uuid); 
       callback(err); 
      }) 
      }, function doneEachMessage(err) { 
      callback(err); 
      }) 
     }) 
     }, function doneEachuser(err) { 
     resolve('Success!'); // resolved the promise 
     }) 
    }) 
    }); 
}; 

exports.down = function (db) { 
    db.select('uuid').from('User').all().then(function(users) { 
    users.forEach(function(user) { 
     db.query(`DROP SEQUENCE positionMessage${user.uuid}`); // SQL DROP SEQUENCE 
    }) 
    }) 
    db.query(`UPDATE Message REMOVE position`) 
}; 

Et maintenant, le script attend l'exécution de toutes les requêtes avant de terminer la migration.