1

我正在尝试在 mongodb compass 中构建聚合管道。我正在使用 $match 查找日期范围内的文档。我希望日期范围始终是“当前周”。

这有效:

 $match: {
    CREATED_ON: {
      $gte: ISODate('2019-09-01'),
      $lt: ISODate('2019-09-07')
    }
  }

但我需要它是这样的:

  $match: {
    CREATED_ON: {
      $gte: *first day of current week*,
      $lt: *last day of current week*
    }
  }

我如何在指南针 agg 管道中执行此操作?

4

1 回答 1

1

我认为没有办法在 Mongo 聚合框架中动态匹配当前日期。

在您的服务器端应用程序中,您必须动态计算开始日期和结束日期,然后将其传递给您的 $match。

下面是一个获取本周开始和结束日期的示例函数(假设开始=星期日和结束=星期六)。

const SUNDAY_DAY_NUMBER = 0;
const SATURDAY_DAY_NUMBER = 6;

/**
 * @example
 * const dateQuery = getDateQueryForCurrentWeek();
 * const matchObject = { CREATED_ON: dateQuery };
 * const findResult = db.getCollection('collection').aggregate([{ $match: matchObject }]).toArray();
 */
const getDateQueryForCurrentWeek = () => {
  const now = new Date();
  const numDaysToBeginningOfWeek = SUNDAY_DAY_NUMBER - now.getDay();
  const numDaysToEndOfWeek = SATURDAY_DAY_NUMBER - now.getDay();

  const firstDayOfCurrentWeek = new Date(
    now.getFullYear(),
    now.getMonth(),
    now.getDate() + numDaysToBeginningOfWeek,
    0,
    0,
    0,
    0
  );
  const lastDayOfCurrentWeek = new Date(
    now.getFullYear(),
    now.getMonth(),
    now.getDate() + numDaysToEndOfWeek,
    24,
    0,
    0,
    -1
  );

  const query = {
    $gte: firstDayOfCurrentWeek,
    $lte: lastDayOfCurrentWeek
  };

  return query;
};

于 2019-11-04T02:44:25.220 回答