MongoDB Aggregation нажимает ноль в ключах при выполнении группы - PullRequest
0 голосов
/ 31 октября 2018

Я не уверен, что это правильный вопрос или нет. Я начал работать над агрегацией mongodb. Я должен сделать график для данных на ежедневной, еженедельной, ежемесячной основе.

Я использую « $ dayOfMonth », « $ week », « $ month » для группировки в зависимости от указанной даты. Например, если разница между датами и датами меньше или равна 6, я группирую ежедневно, используя « $ dayOfMonth », Если разница между датами и датами превышает 6, а группировка « $ week » составляет менее 30, а если разность превышает 30, то группировка выполняется ежемесячно » $ month ».

Я передаю дату в моем " $ match ". Можно ли нажимать 0 в качестве клавиш, если gouping нет.

пример - from_date = "01/01/2018" to_date = "30/6/2018" так группировка будет делаться на месяц. и предположим, что у меня нет даты 3, 4 и 5 месяца. Я хочу нажать 0 во вложенных клавишах в качестве значения.

    output = [
               {"_id": "01/01/2018", "counter":12}, 
               {"_id": "01/02/2018", "counter": 15}, 
               {"_id":"01/06/2018", counter: 10}
             ]

     expected_output = 
             [
              {"_id": "01/01/2018", "counter":12}, 
              {"_id": "01/02/2018", "counter": 15},
              {"_id":"01/03/2018", counter: 0},
              {"_id":"01/04/2018", counter:0},
              {"_id":"01/05/2018", counter: 0},
              {"_id":"01/06/2018", counter: 10}
             ]

Я использую Rails и Mongoid Gem. Запрос, который я использую

    converted = Analytics::Conversion::PharmacyPrescription.collection.aggregate([
       { "$match" => { 
            "organisation_id" => org_id.to_s, 
            "date" => {
              "$gte" => from_date, 
              "$lte" => to_date
            },
            "role_ids" => {"$in" => [role_id, "$role_ids"]}
          }
        },{
          "$project" => {
            "total_count" => 1,
            "converted_count" => 1,
            "not_converted_count" => 1,
            "total_invoice_amount" => 1,
            "user_id" => 1,
            "facility_id" => 1,
            "organisation_id" => 1,
            "date" => 1,
          }
        },{
          "$group" => {
            "_id" => { "#{groupby}" => "$date" },
            "total_count" => {"$sum" => "$total_count"},
            "converted_count" => { "$sum" => "$converted_count" },
            "not_converted_count" => { "$sum" => "$not_converted_count"},
          }
        }
    ]).to_a

1 Ответ

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

Aggregation Framework может агрегировать только документов, которые у вас есть . Вы на самом деле просите его добавить группы для документов, которые не существуют , но у него нет возможности «узнать», какие группы добавить.

Что бы я сделал, это запустил бы запрос в том виде, в котором он у вас есть, а затем «распределил» единицы даты в соответствии с выбранной гранулярностью (в вашем примере это будет 01/01/2018, 01/02/2018, 01 / 03/2018, 01/04/2018, 01/05/2018, 01/06/2018 и запустите простую функцию, которая добавит запись для каждого недостающего подразделения.

...