index.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. var pagesCollection = db.getCollection('pages');
  4. var revisionsCollection = db.getCollection('revisions');
  5. var batchSize = process.env.BATCH_SIZE ?? 100; // default 100 revisions in 1 bulkwrite
  6. var batchSizeInterval = process.env.BATCH_INTERVAL ?? 3000; // default 3 sec
  7. var migrationModule = process.env.MIGRATION_MODULE;
  8. var migrationModules = require(`./migrations/${migrationModule}`);
  9. if (migrationModules.length === 0) {
  10. throw Error('No valid migrationModules found. Please enter a valid environment variable');
  11. }
  12. function replaceLatestRevisions(body, migrationModules) {
  13. var replacedBody = body;
  14. migrationModules.forEach((migrationModule) => {
  15. replacedBody = migrationModule(replacedBody);
  16. });
  17. return replacedBody;
  18. }
  19. var operations = [];
  20. pagesCollection.find({}).forEach((doc) => {
  21. if (doc.revision) {
  22. var revision = revisionsCollection.findOne({ _id: doc.revision });
  23. var replacedBody = replaceLatestRevisions(revision.body, [...migrationModules]);
  24. var operation = {
  25. updateOne: {
  26. filter: { _id: revision._id },
  27. update: {
  28. $set: { body: replacedBody },
  29. },
  30. },
  31. };
  32. operations.push(operation);
  33. // bulkWrite per 100 revisions
  34. if (operations.length > (batchSize - 1)) {
  35. revisionsCollection.bulkWrite(operations);
  36. // sleep time can be set from env var
  37. sleep(batchSizeInterval);
  38. operations = [];
  39. }
  40. }
  41. });
  42. revisionsCollection.bulkWrite(operations);
  43. print('migration complete!');