【问题标题】:add pagination on result of two query. (first query result is used in second query). mongodb, nodejs在两个查询的结果上添加分页。 (第一个查询结果用于第二个查询)。 mongodb,nodejs
【发布时间】: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


    【解决方案1】:

    使用聚合进行查询,然后您可以轻松添加分页

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2021-01-11
      • 2013-11-01
      • 2018-03-20
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2015-02-09
      • 2018-07-30
      相关资源
      最近更新 更多