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]
}
}
}
}])
我正在使用 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]
}
}
}
}])