Согласование с mongodb

#php #mongodb

Вопрос:

Хейя, я знаю, что, возможно, мне не следует писать здесь о такой проблеме, но я просто не могу об этом думать. У меня есть коллекция mongodb, назовем ее сводкой. Там у меня есть следующие поля: идентификатор, идентификатор, дата, цена. Подсуммы проводятся с интервалом в 1 минуту. Я хочу написать aggregationbuilder, который составлял бы отчет из существующих подсуммариев. Отчет вернет среднюю почасовую цену за каждый час за подсуммарид за последние 24 часа. У меня проблема с агрегированием по часам.

 db.Report.aggregate([{ $match: { date: { $gt: 0, $lt: 20 }}}, {$group: { _id: "$subsummaryId", hour: {"$hour": "$date"}, price: {$avg: "$price" }}}])
 

Я получаю

«неизвестный оператор группы «$час»»

Ура!

Комментарии:

1. Пожалуйста, помогите, я понятия не имею, как это сделать :

2. Если вы спрашиваете о конвейере агрегации в целом, удалите все, что связано с доктриной вопроса. Если вы спрашиваете о доктрине, предоставьте рабочий конвейер агрегации с использованием оболочки mongo.

3. Оки, готово! Удалена часть доктрины 🙂 Ну, я понятия не имею, как вообще сделать трубопровод. Я умоляю о помощи…

4. Пожалуйста, прочтите документы по конвейеру агрегации и попробуйте приведенные там примеры.

5. Пссст… ты все еще там? Мне удалось написать его почти целиком, но у меня возникли проблемы с группировкой по часам. Я немного отредактировал вопрос.

Ответ №1:

И идентификатор, и час должны быть частью корзины. Попробуй:

   db.Report.aggregate([{ $match: { date: { $gt: 0, $lt: 20 }}},
 {$group: { _id: {subsummary: "$subsummaryId", hour: {"$hour": "$date"}}, price: {$avg: "$price" }}}])
 

Если это не сработает, добавьте некоторые примеры данных к вопросу.

Если ваше поле даты содержит метку времени, $lt: 20 мне не кажется, что оно будет делать то, что вы хотите.