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!