Ich verwende die Migration, um die Position für Nachrichten basierend auf Benutzern zu aktualisieren. Ich meine, ich werde abfragen, um Benutzer von DB zu bekommen, also vom Benutzer, ich bekomme Nachrichten und aktualisiere Position für sie. ich Sequenzposition fürWarten auf die Ausführung der Abfrage vor dem Abschluss der Migration auf Orientjs
Nachricht erhöhenVersion 1: meinen Code unten
"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`)
};
==> Ergebnis sehen: beendet mit einigen Nachrichten aktualisiert wird. Anzahl ist ungefähr 5-> 50 Datensätze wird aktualisiert. (Gesamt Meldungen sind in DB: 2500)
I Verwendung asynchrones Wasser fällt versucht habe, die jeweils ... meinen Code unten Version siehe 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`)
};
Ergebnis: => Es ist nichts passiert .
orientjs Version ich verwende ist 2.2.6
Ich weiß nicht, was ich falsch mache. Kann mir jemand für eine Lösung helfen? Vielen Dank!