wolf47
@wolf47
Айтишник, немного програмирую на JS

Как сделать отчеты по следующему JSON-у?

Всем привет!

Наконец-то подошел к самому сладкому в моем проекте - к отчетам.

Друзья подскажите плз, как получить отчеты на основе следующих данных?

{
        "_id" : ObjectId("56e6b657753c6d890f614820"),
        "user" : ObjectId("56d9793edf03960106872e76"),
        "comment" : null,
        "status" : ObjectId("56bd55d111b7ed891118a65b"),
        "client" : null,
        "created" : ISODate("2016-03-14T13:02:15.030Z"),
        "ticket" : 0,
        "km" : 0,
        "sum" : 20,
        "service" : {
                "drunkDriver" : false,
                "person" : false,
                "nanny" : false,
                "courier" : false
        },
        "isCash" : false,
        "preorder" : false,
        "direction" : {
                "from" : ObjectId("56dccdd9c82df9d8048e0f6c"),
                "to" : ObjectId("56dccd94c82df9d8048e0f6a")
        },
        "moment" : {
                "closed" : ISODate("2016-03-14T13:15:00Z"),
                "end" : ISODate("2016-03-14T13:45:00Z"),
                "met" : ISODate("2016-03-14T13:00:00Z"),
                "inplace" : ISODate("2016-03-14T13:14:00Z"),
                "notification" : ISODate("2016-03-14T12:50:00Z"),
                "start" : null
        },
        "driver" : ObjectId("56e6a3feb770b5bc0b9e7593"),
        "passengers" : null,
        "__v" : 6
}


У меня еще есть виртуальные поля, не знаю они будут работать?

Вот они:
total - сумма заказа (рассчитывается на основе других данных заказа)
tripTime и waitingTime - время ожидания и время поездки.

Друзья помогите плз сделать следующие отчеты:

Общее количество заказов и сумма по полю user
Общее количество заказов и сумма по полю driver
Сумма и количество заказов по полю created

Мне бы пару примеров

А то вообще не могу представить как можно сделать эти отчеты :)
  • Вопрос задан
  • 363 просмотра
Решения вопроса 1
@mmxdesign
Software Engineer
если предположим что в значение data храниться список ваших данных
var data = [{
"_id" : ObjectId("56e6b657753c6d890f614820"),
"user" : ObjectId("56d9793edf03960106872e76"),
"status" : ObjectId("56bd55d111b7ed891118a65b"),
"created" : ISODate("2016-03-14T13:02:15.030Z"),
"sum" : 20}, ........ ];

тогда можно использовать функцию Reduce
data.reduce(function (result, o) {
    var key = o.user;
    var counter = 1;
    if (!(key in result)) {
        result.arr.push(result[key] = { 
            user: o.user,
            couter: counter, 
            total: o.sum
        });
    } else {
        result[key].total += o.sum;
        counter++;
    }
    return result;
}, { arr: [] }).arr;


получите результат по полю юзер, и общая сумма и количество закаков
По водителю, делаете тоже самое просто вместо user используете driver как ключ.
var key = o.driver;

Рабочий пример на jsFiddle
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nickolas_php
Привет! Может Я несовсем понял идею, но раз уже написаны примеры на mapReduce то может тебе стоит посмотреть в сторону создание отчётов на основе поискового движка Apache Solr? На выходе ты получишь гибкость перестроения отчётов под новые требования + near-realtime + маштабируемость. Идея там такая: Ты загружаешь данные в Solr и с помощью поисковых и аналитических запросов(компоненты facet & stats) делаешь необходимые агрегации. Вот видео с примером построения аналитических отчётов https://www.youtube.com/watch?v=JtbEDef_p9U Сами отчёты ты можешь строить прям в Banana или Kibana на которых как раз делают дашборды для визуализации отчётов см. https://www.youtube.com/watch?v=cqV5lPM2VVE и https://www.youtube.com/watch?v=ddgtvv4W8EM . Я бы выбрал Banana как dasboard builder так как он намного гибче и более адаптирован под Apache Solr. Я же реализовывал аналитику с помощью Solr ещё и с прослойкой HBase. Cуть в том, что если тебе нужно изменять данные, которые уже раз пришли, то лучше для обновлений использовать key-value storage а далее у меня настроен livy-hbase indexer, который порциями обновляет данные в Solr. Вот ссылка с более подробной информацией: bigdata-intips.blogspot.com/2016/06/real-time-apac...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы