Meteor MongoDB:如何将日期范围与收集字段中计算的结束日期聚合?

Meteor MongoDB: How to aggregate date-range with computed end-date from collection field?

我正在使用 Meteor 的 meteorhacks:aggregate 包,我试图在以下日期范围内查找事件:

问题是,结束日期存储在事件文档中 times.until 的字段中。事件文档如下所示:

// Event collection doc:
{
  _id: 'abc',
  times: {
    start: {
      dateTime: "ISODate("2017-03-07T00:00:00Z"),
      timeZone : "America/Chicago"
    },
    until: "20170307T000000Z"
  }
}

我能够聚合以查找某个范围内的日期,但我不知道如何根据事件的 times.until 字段计算该范围的结束日期。

if (Meteor.isServer) {
  Meteor.methods({
    'events.inProgress'() {
      const start = moment().utc().subtract(1, 'day').toDate();

      return Events.aggregate([
        {$match: {"times.start.dateTime": {$gt: start, $lt: end**(MUST COMPUTE end FROM DOC'S times.until PLUS 2 WEEKS)**}}},
      ]);
    }
  }
}

另外,请注意 times.until 字段的格式是 20170307T000000Z(不确定此格式的正确名称)。这不是 JavaScript Date 的有效格式,但 moment.js 可以毫无问题地处理此字符串。通过访问 times.until 字段,我可以:

const end = moment(event.times.until).add(2, 'week').toDate();

这确实为我提供了范围的正确结束日期,但如何在构建管道时获取 times.until 字段来计算结束日期?

使用$add加上毫秒来得到你想要的日期。当然这意味着 times.until 是 mongo 日期类型。

aggregate([{
    $match: {
        "times.start.dateTime": {
            $gt: start,
            $lt: {
                $add: ["$times.until", 14 * 24 * 60 * 60000]
            }
        }
    }
}])