0

我正在为 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 处理这个 String 没有问题。通过访问该times.until字段,我可以执行以下操作:

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

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

4

1 回答 1

1

使用$add添加毫秒以获得所需的日期。当然,这意味着 times.until 是 mongo 日期类型。

aggregate([{
    $match: {
        "times.start.dateTime": {
            $gt: start,
            $lt: {
                $add: ["$times.until", 14 * 24 * 60 * 60000]
            }
        }
    }
}])
于 2016-12-03T19:25:13.863 回答