0

我目前在 for 循环中设置了对数据库的多个请求。

// 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 参数,但没有走远。任何提示将不胜感激。

4

1 回答 1

0

您的查询似乎找到了在给定日期开始或结束的记录。与week连续天的范围一样,这实际上转化为对在该周开始或在该周结束的记录查询。

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

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

您的其余代码可以保持原样。只需删除带有for和相应结束括号的行。

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

于 2020-08-20T15:34:56.253 回答