#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
мне не кажется, что оно будет делать то, что вы хотите.