From f06e5d1c61c5e75120e1bd1594324ec094722006 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 27 Mar 2018 12:33:51 +0900
Subject: [PATCH] Fix bug

---
 .../node.1522066477.user-account-keypair.js   | 43 +++++++++++++++----
 1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/tools/migration/node.1522066477.user-account-keypair.js b/tools/migration/node.1522066477.user-account-keypair.js
index effea137c..c413e3db1 100644
--- a/tools/migration/node.1522066477.user-account-keypair.js
+++ b/tools/migration/node.1522066477.user-account-keypair.js
@@ -1,14 +1,39 @@
+// for Node.js interpret
+
 const { default: User } = require('../../built/api/models/user');
 const { generate } = require('../../built/crypto_key');
+const { default: zip } = require('@prezzemolo/zip')
 
-const updates = [];
-
-User.find({}).each(function(user) {
-	updates.push(User.update({ _id: user._id }, {
+const migrate = async (user) => {
+	const result = await User.update(user._id, {
 		$set: {
-			'account.keypair': generate(),
+			'account.keypair': generate()
 		}
-	}));
-}).then(function () {
-	Promise.all(updates)
-}).then(process.exit);
+	});
+	return result.ok === 1;
+}
+
+async function main() {
+	const count = await User.count({});
+
+	const dop = Number.parseInt(process.argv[2]) || 5
+	const idop = ((count - (count % dop)) / dop) + 1
+
+	return zip(
+		1,
+		async (time) => {
+			console.log(`${time} / ${idop}`)
+			const doc = await User.find({}, {
+				limit: dop, skip: time * dop
+			})
+			return Promise.all(doc.map(migrate))
+		},
+		idop
+	).then(a => {
+		const rv = []
+		a.forEach(e => rv.push(...e))
+		return rv
+	})
+}
+
+main().then(console.dir).catch(console.error)