Mongo Aggregation игнорирует фильтр диапазона дат в $ match - PullRequest
1 голос
/ 06 мая 2019

У меня есть запрос агрегации Монго, который возвращает правильные результаты, за исключением диапазона дат, указанного в $ 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.

Что я пропускаю? Нужно ли добавлять какой-то $ cond?

1 Ответ

1 голос
/ 06 мая 2019

Вам нужно обернуть $gte и $lte внутри отдельных фигурных скобок

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