猫鼬:从许多查询减少到一个

时间:2020-08-20 14:45:54

标签: javascript node.js mongoose moment-range

我目前有一个设置,其中有一个循环中对数据库的多个请求。

// week is a moment-range object
for (const day of week.by('day')) {
    // get start and end of day
    const startDay = day.startOf('day').toDate();
    const endDay = day.endOf('day').toDate();

    // I would like to reduce this query to one
    const data = await Model.find({
      $or: [
        {
          $and: [{ start: { $gte: startDay } }, { start: { $lt: endDay } }],
        },
        {
          $and: [{ end: { $gte: startDay } }, { end: { $lt: endDay } }],
        },
      ],
    })
      .sort({ start: 'asc' })
      .select('_id someref')
      .populate('someref', 'name');

    console.log(data);
}

这不是很有效,因此我想将其简化为一个查询,按当前数据返回分组。

我已经尝试过在for循环中准备find参数,但是距离还很远。任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的查询似乎找到了在给定日期开始或结束的记录。由于week是连续几天的范围,因此实际上可以转换为查询开始于 week 或结束于 week 的记录。

因此,您可以删除for循环,并将startDayendDay定义为一周的开始/结束,如下所示:

const startDay = week.start.startOf('day').toDate();
const endDay = week.end.endOf('day').toDate();

其余代码可以保持原样。只需用for和相应的大括号删除行即可。

尽管有一个区别是您将不再获得任何重复。在您当前的代码中,您将获得在一周中(但不是在同一天)两次 开始和结束的记录。这段代码不会发生这种情况。