MongoDB Aggregation нажимает ноль в ключах при выполнении группы
Я не уверен, что это правильный вопрос или нет. Я начал работать над агрегацией mongodb. Я должен сделать график для данных на ежедневной, еженедельной, ежемесячной основе.
Я использую " $ dayOfMonth ", " $ week ", " $ month " для группировки в зависимости от предоставленной даты. Например, если разница между датами и датами меньше или равна 6, я группирую ежедневно, используя " $ dayOfMonth ", если разница между датами и датами больше 6 и менее 30 группировок выполняется из " $ week " и, если больше 30, тогда группировка производится ежемесячно " $ month ".
Я передаю дату в моем " $ match ". Можно ли нажимать 0 в качестве клавиш, если нет гупинга.
пример - 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 ответ
Aggregation Framework может агрегировать только те документы, которые у вас есть. Вы на самом деле просите его добавить группы для документов, которые не существуют, но у него нет возможности "узнать", какие группы добавить.
Я хотел бы выполнить запрос, как он есть, и затем "распределить" единицы даты в соответствии с выбранной детализацией (в вашем примере это будет 01/01/2018, 01/02/2018, 01/03/2018, 01/04/2018, 01/05/2018, 01/06/2018 и запустите простую функцию, которая добавит запись для каждого пропавшего юнита.