首页 > 解决方案 > 如何使用 let 和 piplines 改进我的性能查询 - Mongoose

问题描述

我有一个使用节点 js 和猫鼬创建的查询(查找并使用 for 循环)。我想提高这个查询的性能,我尝试了以下解决方案,但我需要一个查询的解决方案(使用聚合、管道、让),我认为它会更好。

旧解决方案

const chaptersProgress = async function(userId, subjectId) {
          const chapters = await Chapters.find({subject_id: subjectId, visible: true});
      const chaptersProgress = [];
      for (const chapter of chapters) {
        const progress = await chapterProgress(userId, chapter.id);
        chaptersProgress.push(progress);
      }
    
      console.log('chaptersProgress : ', chaptersProgress)
      return chaptersProgress;
    };
    
    const chapterProgress = async function(userId, chapterId) {
      const contentIds = await Contents.find({
        'divisions.chapter_id': String(chapterId),
        'active': true,
        'is_draft': false,
      })
          .distinct('id');
      const completed = await VideoProgress.find({
        content_id: {'$in': contentIds},
        user_id: userId,
        completed: 1,
      })
          .distinct('content_id');
      const value = (completed.length * 100) / contentIds.length;
    
      return {
        chapter_id: chapterId,
        value: Math.ceil(value) || 0,
      };
}

新解决方案

const chaptersProgress = async function(userId, subjectId) {
     let chapters = await Chapters.find({subject_id: subjectId, visible: true}).select('id name');
      console.log('Chapter progress 1 : ', chapters);
      var map =  await Promise.all(chapters.map(async (el) => {
        let contentIds = await Contents.find({
          'divisions.chapter_id': String(el.id),
          'active': true,
          'is_draft': false,
        })
            .distinct('id');
        console.log('contentIds : ', contentIds);
        let completed  = await VideoProgress.find({
          content_id : {$in: contentIds},
          user_id: userId,
          completed: 1
        }) .distinct('content_id');
    
    
        console.log('completed : ', completed);
    
    
        let value = (completed.length * 100) / contentIds.length;
    
        return {chapter_id: el.id, value: Math.ceil(value) || 0};
      }))
      console.log('Chapter progress 2 : ', map);
    
      return map;
}

架构章节

{
  id: {type: mongoose.SchemaTypes.Number, index: true, required: true},
  name: {type: mongoose.SchemaTypes.String, required: false},
  visible: {type: mongoose.SchemaTypes.Boolean, required: false},
  subject_id: {type: mongoose.SchemaTypes.Number, required: true},
};

架构内容

{
     id: {type: mongoose.SchemaTypes.Number, index: true, required: true},
     active: {type: mongoose.SchemaTypes.Boolean, required: false},
     is_draft: {type: mongoose.SchemaTypes.Boolean, required: false},
     divisions: {type: mongoose.SchemaTypes.Mixed, required: false}
}

架构视频进度

{
  user_id: {type: mongoose.SchemaTypes.Number, index: true, required: true},
  content_id: {type: mongoose.SchemaTypes.Number, index: true, required: true},
  chapter_id: {type: mongoose.SchemaTypes.Number, index: true, required: true},
  completed: {type: mongoose.SchemaTypes.Boolean, required: true},
}

标签: node.jsmongooseaggregatepipelinelet

解决方案


推荐阅读