index.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /* eslint-disable no-undef, no-var, vars-on-top, no-restricted-globals, regex/invalid, import/extensions */
  2. // ignore lint error because this file is js as mongoshell
  3. /**
  4. * @typedef {import('./types').MigrationModule} MigrationModule
  5. * @typedef {import('./types').ReplaceLatestRevisions} ReplaceLatestRevisions
  6. */
  7. var pagesCollection = db.getCollection('pages');
  8. var revisionsCollection = db.getCollection('revisions');
  9. var batchSize = process.env.BATCH_SIZE ?? 100; // default 100 revisions in 1 bulkwrite
  10. var batchSizeInterval = process.env.BATCH_INTERVAL ?? 3000; // default 3 sec
  11. var migrationModule = process.env.MIGRATION_MODULE;
  12. /** @type {MigrationModule[]} */
  13. var migrationModules = require(`./migrations/${migrationModule}`);
  14. if (migrationModules.length === 0) {
  15. throw Error('No valid migrationModules found. Please enter a valid environment variable');
  16. }
  17. /** @type {ReplaceLatestRevisions} */
  18. function replaceLatestRevisions(body, migrationModules) {
  19. var replacedBody = body;
  20. migrationModules.forEach((migrationModule) => {
  21. replacedBody = migrationModule(replacedBody);
  22. });
  23. return replacedBody;
  24. }
  25. var operations = [];
  26. pagesCollection.find({}).forEach((doc) => {
  27. if (doc.revision) {
  28. var revision = revisionsCollection.findOne({ _id: doc.revision });
  29. var replacedBody = replaceLatestRevisions(revision.body, [...migrationModules]);
  30. var operation = {
  31. updateOne: {
  32. filter: { _id: revision._id },
  33. update: {
  34. $set: { body: replacedBody },
  35. },
  36. },
  37. };
  38. operations.push(operation);
  39. // bulkWrite per 100 revisions
  40. if (operations.length > (batchSize - 1)) {
  41. revisionsCollection.bulkWrite(operations);
  42. // sleep time can be set from env var
  43. sleep(batchSizeInterval);
  44. operations = [];
  45. }
  46. }
  47. });
  48. revisionsCollection.bulkWrite(operations);
  49. print('migration complete!');