Просмотр исходного кода

Use recursive function to not handle all pages at once

Taichi Masuyama 4 лет назад
Родитель
Сommit
851a8a210b

+ 50 - 39
packages/app/src/migrations/20211227060705-revision-path-to-page-id-schema-migration.js

@@ -14,27 +14,31 @@ module.exports = {
     const Page = getModelSafely('Page') || getPageModel();
     const Revision = getModelSafely('Revision') || require('~/server/models/revision')();
 
-    const pages = await Page.find({ revision: { $ne: null } }, { _id: 1, revision: 1 });
+    const recursiveUpdate = async(offset = 0) => {
+      const pages = await Page.find({ revision: { $ne: null } }, { _id: 1, revision: 1 }).skip(offset).limit(100).exec();
+      if (pages.length === 0) {
+        return;
+      }
+      const updateManyOperations = pages.map((page) => {
+        return {
+          updateMany: {
+            filter: { _id: page.revision },
+            update: [
+              {
+                $unset: ['path'],
+              },
+              {
+                $set: { pageId: page._id },
+              },
+            ],
+          },
+        };
+      });
+      await Revision.bulkWrite(updateManyOperations);
+      await recursiveUpdate(offset + 100);
+    };
 
-    // make map revisionId to pageId
-    const updateManyOperations = pages.map((page) => {
-      return {
-        updateMany: {
-          filter: { _id: page.revision },
-          update: [
-            {
-              $unset: ['path'],
-            },
-            {
-              $set: { pageId: page._id },
-            },
-          ],
-        },
-      };
-    });
-
-    // updateMany by array
-    await Revision.bulkWrite(updateManyOperations);
+    await recursiveUpdate();
 
     logger.info('Migration has successfully applied');
   },
@@ -45,28 +49,35 @@ module.exports = {
     const Page = getModelSafely('Page') || getPageModel();
     const Revision = getModelSafely('Revision') || require('~/server/models/revision')();
 
+    const recursiveUpdate = async(offset = 0) => {
+      const pages = await Page.find({ revision: { $ne: null } }, { _id: 1, revision: 1, path: 1 }).skip(offset).limit(100).exec();
+      if (pages.length === 0) {
+        return;
+      }
 
-    const pages = await Page.find({ revision: { $ne: null } }, { _id: 1, revision: 1, path: 1 });
+      // make map revisionId to pageId
+      const updateManyOperations = pages.map((page) => {
+        return {
+          updateMany: {
+            filter: { _id: page.revision },
+            update: [
+              {
+                $unset: ['pageId'],
+              },
+              {
+                $set: { path: page.path },
+              },
+            ],
+          },
+        };
+      });
 
-    // make map revisionId to pageId
-    const updateManyOperations = pages.map((page) => {
-      return {
-        updateMany: {
-          filter: { _id: page.revision },
-          update: [
-            {
-              $unset: ['pageId'],
-            },
-            {
-              $set: { path: page.path },
-            },
-          ],
-        },
-      };
-    });
+      // updateMany by array
+      await Revision.bulkWrite(updateManyOperations);
+      await recursiveUpdate(offset + 100);
+    };
 
-    // updateMany by array
-    await Revision.bulkWrite(updateManyOperations);
+    await recursiveUpdate();
 
     logger.info('Migration down has successfully applied');
   },