node.js - 如何使用 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},
}
解决方案
推荐阅读
- git - 是否可以将子模块更改保存到主 git 索引?
- assembly - 按下鼠标两次后退出的汇编程序
- excel - 使用 VBA 添加数据验证时,类型的应用程序定义或对象定义错误
- spring - 事务未提交
- python - 如何在不转换为 Numpy 数组的情况下将 TensorFlow 张量转换为 PyTorch 张量?
- ios - Flutter,为 IOS 构建:在 Iphone 上看不到登录页面
- qt - QtObject 元素在 QML 中的工作原理
- c++ - 当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?
- excel - 匹配来自多个单元格的部分数据并返回值
- python - ImportError:没有名为 pageObjects.LoginPage 的模块