|
@@ -1,6 +1,8 @@
|
|
|
// disable no-return-await for model functions
|
|
// disable no-return-await for model functions
|
|
|
/* eslint-disable no-return-await */
|
|
/* eslint-disable no-return-await */
|
|
|
|
|
|
|
|
|
|
+const flatMap = require('array.prototype.flatmap');
|
|
|
|
|
+
|
|
|
const mongoose = require('mongoose');
|
|
const mongoose = require('mongoose');
|
|
|
const mongoosePaginate = require('mongoose-paginate');
|
|
const mongoosePaginate = require('mongoose-paginate');
|
|
|
|
|
|
|
@@ -64,7 +66,16 @@ class PageTagRelation {
|
|
|
* @return {object} key: Page._id, value: array of tag names
|
|
* @return {object} key: Page._id, value: array of tag names
|
|
|
*/
|
|
*/
|
|
|
static async getIdToTagNamesMap(pageIds) {
|
|
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()
|
|
const results = await this.aggregate()
|
|
|
.match({ relatedPage: { $in: pageIds } })
|
|
.match({ relatedPage: { $in: pageIds } })
|
|
|
.group({ _id: '$relatedPage', tagIds: { $push: '$relatedTag' } });
|
|
.group({ _id: '$relatedPage', tagIds: { $push: '$relatedTag' } });
|
|
@@ -73,23 +84,24 @@ class PageTagRelation {
|
|
|
return {};
|
|
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
|
|
// 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));
|
|
const distinctTagIds = Array.from(new Set(allTagIds));
|
|
|
|
|
|
|
|
// retrieve tag documents
|
|
// retrieve tag documents
|
|
|
const Tag = mongoose.model('Tag');
|
|
const Tag = mongoose.model('Tag');
|
|
|
- const tagIdToNameMap = Tag.getIdToNameMap(distinctTagIds);
|
|
|
|
|
|
|
+ const tagIdToNameMap = await Tag.getIdToNameMap(distinctTagIds);
|
|
|
|
|
|
|
|
// convert to map
|
|
// convert to map
|
|
|
const idToTagNamesMap = {};
|
|
const idToTagNamesMap = {};
|
|
|
results.forEach((result) => {
|
|
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;
|
|
idToTagNamesMap[result._id] = tagNames;
|
|
|
});
|
|
});
|
|
|
|
|
|