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

Mongoose: Reduce from many queries to one

我目前有一个在 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);
}

这不是很有效,因此我想将其减少为一个查询,按当前 return 数据分组。

我已经尝试在 for 循环中准备 find 参数,但没有成功。任何提示将不胜感激。

您的查询似乎要查找在给定日期开始或结束的记录。由于 week 是一系列连续的天数,这实际上转化为对从 开始或在 周 [=] 结束的记录的查询27=].

所以你可以删除for循环,并定义startDayendDay作为一周的start/end,如下:

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

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

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