Jelajahi Sumber

use cursor and updatemany

yuto-o 4 tahun lalu
induk
melakukan
dd4f73031b

+ 36 - 26
packages/app/src/migrations/20210921173042-add-is-trashed-field.js

@@ -11,37 +11,47 @@ module.exports = {
     logger.info('Apply migration');
     logger.info('Apply migration');
     mongoose.connect(config.mongoUri, config.mongodb.options);
     mongoose.connect(config.mongoUri, config.mongodb.options);
 
 
-    const addFieldRequests = [];
-    const updateDeletedPageIds = [];
+    const LIMIT = 1000;
+    let updateDeletedPageIds = [];
 
 
+    // set isPageTrashed as false temporarily
+    await db.collection('pagetagrelations').updateMany(
+      {},
+      { $set: { isPageTrashed: false } },
+    );
+
+    let counter = 0;
     for await (const deletedPage of Page.find({ status: Page.STATUS_DELETED }).select('_id').cursor()) {
     for await (const deletedPage of Page.find({ status: Page.STATUS_DELETED }).select('_id').cursor()) {
+      counter += 1;
       updateDeletedPageIds.push(deletedPage._id);
       updateDeletedPageIds.push(deletedPage._id);
-      addFieldRequests.push(
-        {
-          updateMany: {
-            filter: { relatedPage: deletedPage._id },
-            update: { $set: { isPageTrashed: true } },
-          },
-        },
-      );
+      if (counter % LIMIT === 0) {
+        try {
+          await db.collection('pagetagrelations').updateMany(
+            { relatedPage: { $in: updateDeletedPageIds } },
+            { $set: { isPageTrashed: true } },
+          );
+          logger.info('Migration of 1,000 deleted page operations has successfully applied');
+        }
+        catch (err) {
+          logger.error(err);
+          logger.info('Migration of 1,000 deleted page operations has failed');
+        }
+        updateDeletedPageIds = [];
+      }
     }
     }
 
 
-    addFieldRequests.push(
-      {
-        updateMany: {
-          filter: { relatedPage: { $nin: updateDeletedPageIds } },
-          update: { $set: { isPageTrashed: false } },
-        },
-      },
-    );
-
-    try {
-      await db.collection('pagetagrelations').bulkWrite(addFieldRequests);
-      logger.info('Migration has successfully applied');
-    }
-    catch (err) {
-      logger.error(err);
-      logger.info('Migration has failed');
+    if (updateDeletedPageIds.length > 0) {
+      try {
+        await db.collection('pagetagrelations').updateMany(
+          { relatedPage: { $in: updateDeletedPageIds } },
+          { $set: { isPageTrashed: true } },
+        );
+        logger.info(`Migration of ${updateDeletedPageIds.length} deleted page operations has successfully applied`);
+      }
+      catch (err) {
+        logger.error(err);
+        logger.info(`Migration of ${updateDeletedPageIds.length} deleted page operations has failed`);
+      }
     }
     }
 
 
   },
   },