Yuki Takei 6 лет назад
Родитель
Сommit
8c0424e9a9
3 измененных файлов с 23 добавлено и 11 удалено
  1. 20 8
      src/server/models/page-tag-relation.js
  2. 1 1
      src/server/models/tag.js
  3. 2 2
      src/server/util/search.js

+ 20 - 8
src/server/models/page-tag-relation.js

@@ -1,6 +1,8 @@
 // disable no-return-await for model functions
 /* eslint-disable no-return-await */
 
+const flatMap = require('array.prototype.flatmap');
+
 const mongoose = require('mongoose');
 const mongoosePaginate = require('mongoose-paginate');
 
@@ -64,7 +66,16 @@ class PageTagRelation {
    * @return {object} key: Page._id, value: array of tag names
    */
   static async getIdToTagNamesMap(pageIds) {
-    // see https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pivot-data
+    /**
+     * @see https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pivot-data
+     *
+     * results will be:
+     * [
+     *   { _id: 58dca7b2c435b3480098dbbc, tagIds: [ 5da630f71a677515601e36d7, 5da77163ec786e4fe43e0e3e ]},
+     *   { _id: 58dca7b2c435b3480098dbbd, tagIds: [ ... ]},
+     *   ...
+     * ]
+     */
     const results = await this.aggregate()
       .match({ relatedPage: { $in: pageIds } })
       .group({ _id: '$relatedPage', tagIds: { $push: '$relatedTag' } });
@@ -73,23 +84,24 @@ class PageTagRelation {
       return {};
     }
 
-    console.log(results);
-    console.log(results.map(result => result.tagIds));
+    results.flatMap = flatMap.shim(); // TODO: remove after upgrading to node v12
 
     // extract distinct tag ids
-    const allTagIds = await results
-      .map(result => result.tagIds) //  [[tagId1, tagId2, ...], [tagId1, tagId3, ...] ... ]
-      .flat(); //                       [tagId1, tagId2, tagId1, tagId3, ...]
+    const allTagIds = results
+      .flatMap(result => result.tagIds); // map + flatten
     const distinctTagIds = Array.from(new Set(allTagIds));
 
     // retrieve tag documents
     const Tag = mongoose.model('Tag');
-    const tagIdToNameMap = Tag.getIdToNameMap(distinctTagIds);
+    const tagIdToNameMap = await Tag.getIdToNameMap(distinctTagIds);
 
     // convert to map
     const idToTagNamesMap = {};
     results.forEach((result) => {
-      const tagNames = result.tagsIds.map(tagId => tagIdToNameMap[tagId]);
+      const tagNames = result.tagIds
+        .map(tagId => tagIdToNameMap[tagId])
+        .filter(tagName => tagName != null); // filter null object
+
       idToTagNamesMap[result._id] = tagNames;
     });
 

+ 1 - 1
src/server/models/tag.js

@@ -24,7 +24,7 @@ schema.plugin(mongoosePaginate);
 class Tag {
 
   static async getIdToNameMap(tagIds) {
-    const tags = this.find({ _id: { $in: tagIds } });
+    const tags = await this.find({ _id: { $in: tagIds } });
 
     const idToNameMap = {};
     tags.forEach((tag) => {

+ 2 - 2
src/server/util/search.js

@@ -454,12 +454,12 @@ SearchClient.prototype.addAllPages = async function() {
       const idToTagNamesMap = await PageTagRelation.getIdToTagNamesMap(pageIds);
       const idsHavingTagNames = Object.keys(idToTagNamesMap);
 
-      // append count
+      // append tagNames
       chunk
         .filter(doc => idsHavingTagNames.includes(doc._id.toString()))
         .forEach((doc) => {
           // append tagName from idToTagNamesMap
-          doc.bookmarkCount = idToTagNamesMap[doc._id.toString()];
+          doc.tagNames = idToTagNamesMap[doc._id.toString()];
         });
 
       this.push(chunk);