Mongo聚合忽略$ match中的日期范围过滤器

时间:2019-05-05 21:28:52

标签: node.js mongodb mongoose aggregation-framework

我有一个Mongo聚合查询,该查询返回正确的结果,但$ match中提供的日期范围除外。无论日期范围值有无,它基本上都会返回相同的结果。基本上,我正在尝试确定特定日期每个位置的已发送邮件总数。

const startOfToday = moment()
  .startOf('day')
  .tz('America/New_York')

const endOfToday = moment()
  .endOf('day')
  .tz('America/New_York')

// Show Todays Entries Only
let fromDate = new Date(startOfToday);
let toDate = new Date(endOfToday);

  Model.aggregate([
  {
    $match: {
      'analytics.twilio.status': 'delivered',
      'analytics.twilio.date': { $gte: fromDate },
      'analytics.twilio.date': { $lte: toDate }
    }
  },
  {
    $lookup: {
      from: 'branches',
      localField: 'branch',
      foreignField: '_id',
      as: 'branch'
    }
  },
  {
    $match: {
      'branch.0.org_id': orgId
    }
  },
  { $unwind: '$branch' },
  {
    $group: {
      _id: '$branch.name',
      delivered: { $sum: 1 }
    }
  }
])
  .sort('_id')
  .then(response => {
    if (response) {
      res.json(response);
    }
  });
 });

这是该模式的截断版本:

const Wip =  new Schema({
      branch: {
        type: Schema.Types.ObjectId,
        ref: 'branches'
      },
      analytics: {
        twilio: {
          sid: { type: String },
          status: { type: String },
          error: { type: String },
          date: { type: Date }
        }
      },
        date: { type: Date, default: Date.now }
      });

    const BranchSchema = new Schema({
        name: { type: String, required: true },
        org_id: { type: String, required: true },
        clinic_id: { type: String, required: true },
    })

我认为问题可能是$ lookup,但是如果我删除$ lookup并将$ branch字段用作$ group id,问题仍然会发生。

我俯瞰什么?我需要添加某种$ cond吗?

1 个答案:

答案 0 :(得分:1)

您需要将$gte$lte都包裹在单个花括号中

Model.aggregate([
  {
    $match: {
      'analytics.twilio.status': 'delivered',
      'analytics.twilio.date': { '$gte': fromDate, '$lte': toDate }
    }
  }
])