Как заставить сопоставителей работать с агрегацией для диапазонов дат? - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть модель с автором (это mongoose.Schema.ObjectId), и у меня есть поле даты для этой модели (тип Date).

Это работает когда я это делаю, данные возвращаются:

MyModel.find({
    author: req.user._id,
    started: {
      $gte: start,
      $lte: end
    }
  });

Но у меня в схеме есть функция агрегирования, вот как это выглядит:

myModelSchema.statics.getSomeData = function getSomeData(id, start, end) {
  const query = [
    { $sort: { started: 1 } },
    {
      $lookup: {
        from: 'projects',
        localField: 'project',
        foreignField: '_id',
        as: 'projectdata'
      }
    },
    {
      $lookup: {
        from: 'tasks',
        localField: 'task',
        foreignField: '_id',
        as: 'taskdata'
      }
    }
  ];
  if (start && end) {
    query.unshift({
      $match: {
        $and: [{ started: { $gte: start, $lte: end } }, { author: id }]
      }
    });
  } else {
    query.unshift({ $match: { author: id } });
  }
  return this.aggregate(query);
};

Примечание : часть, в которую я отправляю сопоставление для автора, которая возвращает мне все данные с текущим автором , работает , но часть, в которой я также хочу, чтобы данные возврат в диапазон дат не работает, данные становятся пустыми, когда даты начала и окончания передаются статической функции.

Формат даты, который я передаю функции агрегации: '2018-11-04 06: 00: 00' (строка).

1 Ответ

0 голосов
/ 04 ноября 2018

На самом деле вы сопоставляете объект даты со строковым значением, которое вообще не будет работать, поэтому значение также должно быть объектом даты

myModelSchema.statics.getSomeData = function getSomeData(id, start, end) {
const query = [
    { $sort: { started: 1 } },
    {
    $lookup: {
        from: 'projects',
        localField: 'project',
        foreignField: '_id',
        as: 'projectdata'
    }
    },
    {
    $lookup: {
        from: 'tasks',
        localField: 'task',
        foreignField: '_id',
        as: 'taskdata'
    }
    }
];
if (start && end) {
    query.unshift({
    $match: {
        $and: [{ started: { $gte: new Date(start), $lte: new Date(end) } }, { author: id }]
    }
    });
} else {
    query.unshift({ $match: { author: id } });
}
return this.aggregate(query);
};
...