【发布时间】:2022-10-07 18:17:07
【问题描述】:
结果数据应如下所示:
[
{
Feed_id:
Feed_title:
User_Name:
project_title:
event_object: { // all event data }
},
...
]
==> 提要包含项目、用户和 taskIdsList, ===> 获取过滤后的提要后,获取所有任务列表并查找事件。
===> 这里分页是应用于事件的第二次查询,所以如果数据集很大并且提取了许多提要(如1000),它会减慢进程并使用更多内存。?有什么办法可以解决它可能是事件架构的变化
型号和查询代码:
同一事件可以在多个提要中。因为同一个任务可以在多个事件中。
饲料模型
const feedSchema = new Schema({
title: {
type: String,
required: [true, \'Please enter title.\']
},
project: {
type: Schema.Types.ObjectId,
ref: \'project\',
required: [true, \'Please enter project.\']
},
user: {
type: Schema.Types.ObjectId,
ref: \'user\',
},
task: [{
type: Schema.Types.ObjectId,
ref: \'task\',
}],
usersSharedFeed: [{
type: Schema.Types.ObjectId,
ref: \'user\',
default: []
}],
}, {
timestamps: true,
});
事件模型
const eventSchema = new Schema({
title: {
type: String,
},
taskId: {
type: Schema.Types.ObjectId,
},
description: {
type: String,
default: \'\'
},
endDateTime: {
type: Date,
}
}, {
timestamps: true,
});
这是通过任务 ID 的提要和事件之间的关系。
获取与用户共享提要的提要数据。
const feedFetched = await feedModel.find({ usersSharedFeed: { $in: req.user._id }, isArchived: false })
.populate({
path: \'user\',
select: { fullName: 1, profileImage: 1 }
})
.populate({ path: \'project\', select: { title: 1 } })
.select({ project: 1, task: 1, usersSharedFeed: 1, user: 1, title: 1 });
从提要数据创建 taskIDList。并获取事件。
const events = await eventModel.find({ taskId: { $in: taskIdList }, isArchived: false })
.select({ taskId: 1, timeSpent: 1, endDateTime: 1, title: 1, imageUrl: 1, description: 1 })
.sort({ endDateTime: -1 })
.limit(parseInt(req.query.perPage) * parseInt(req.query.pageNo))
.skip(parseInt(req.query.perPage) * parseInt(req.query.pageNo) - parseInt(req.query.perPage))
现在通过匹配 taskId 将事件数据映射到 feed 以获得所需的结果。它运行嵌套的 for 循环,随着获取的提要数据的增加,这再次增加了成本。
events.forEach((event) => {
for (let i = 0; i < feed.length; i++) {
if (feed[i].task && feed[i].task.includes(event.taskId)) {
combineFeed.push({
_id: feed[i]._id,
title: feed[i].title,
project: feed[i].project,
user: feed[i].user,
event,
});
}
}
});
这里我没有在模式中添加所有字段,以免增加不必要的数据。
任何形式的反馈表示赞赏。
标签: node.js mongodb mongoose pagination