Мой документ выглядит так:
{ "_id" : "2012047994", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 13, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "Y", "compSco" : 93, "bilFips" : "34017", "bilStAbb" : "NJ", "bilZip" : "07002", "root" : "Z", "bilCity" : "BAYONNE", "nHhChld" : "0", "hhComp" : "G", "child" : "N", "hhIncDtl" : "085", "dwelSize" : "C", "dwelType" : "A", "ownRent" : "H", "tract" : "010100", "bg" : "2", "cbsa" : "35620", "cbsaType" : "A", "cntySize" : "1", "cd" : "3410", "areaCode" : "201" }
{ "_id" : "2012046994", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 6, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
{ "_id" : "2012012995", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 0, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
{ "_id" : "2012019995", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 13, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
{ "_id" : "2012042995", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 13, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "bilZip" : "07306", "root" : "Z", "bilFips" : "34017", "bilCity" : "JERSEY CITY", "bilStAbb" : "NJ", "areaCode" : "201" }
{ "_id" : "2012019996", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 4, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
{ "_id" : "2012046995", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 7, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "compSco" : 83, "bilFips" : "42029", "bilStAbb" : "PA", "bilZip" : "19362", "root" : "Z", "bilCity" : "NOTTINGHAM", "persons" : [ { "gnd" : "F", "ageSco" : "E", "age" : 41 }, { "ageSco" : "E", "age" : 20 }, { "gnd" : "M", "ageSco" : "I", "age" : 23 } ], "hhEthGrp" : [ { "13" : 100 } ], "hhEthCode" : [ { "O" : 100 } ], "hhRelig" : [ { "C" : 100 } ], "hhOrig" : [ { "01" : 100 } ], "hhLang" : [ { "20" : 100 } ], "hhEdu" : [ { "51" : 33 }, { "55" : 66 } ], "hhOccuGrp" : [ { "I6" : 100 } ], "hhMarry" : [ { "0U" : 66 }, { "5M" : 33 } ], "nHhChld" : "2", "hhComp" : "D", "child" : "Y", "children" : [ { "age" : 7, "ageSco" : "B", "gnd" : "U" }, { "age" : 10, "ageSco" : "B", "gnd" : "U" }, { "age" : 13, "ageSco" : "C", "gnd" : "U" }, { "age" : 16, "ageSco" : "C", "gnd" : "U" } ], "hhIncDtl" : "001", "dwelSize" : "A", "dwelType" : "S", "tract" : "308200", "bg" : "1", "cbsa" : "37980", "cbsaType" : "A", "cntySize" : "1", "cd" : "4216", "areaCode" : "201" }
{ "_id" : "2012047995", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 6, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
{ "_id" : "2012012996", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 4, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
{ "_id" : "2012019997", "version" : "1.0", "stAbbTPM" : "NJ", "phActNum" : 7, "stRateCtr" : "NJ-JERSEYCITY", "prepaid" : "N", "root" : "S", "areaCode" : "201" }
Что я хочу сделать, это сделать многоуровневую группировку, где пользователь может передать параметры для группировки результата и подсчитать, сколько таких элементов существует?
Например, если пользователь выбирает Prepaid, BilZips и OwnRent, результат должен разбить количество чисел на уровне, например
prepaid:{
Y:{
bilFips:{
XXXX: {
OwnRent:{
H:1,
A:4,
C: 3
}
}
}
},
N:{
bilFips:{
XXXX: {
OwnRent:{
H:6,
A:3,
C: 2
}
}
}
}
}
Как я могу сделать это динамически? со всеми этими параметрами группировки, поступающими динамически.
Это то, что я пробовал на данный момент. Я не уверен, правильно ли работает конвейер агрегации для go, а также как сделать код устойчивым для адаптации к более чем 3 аргументам фильтра?
(param1, countArgs)=>{
// some code here
//countArgs [Prepaid, ownRent, hhEthGrp]
const countVals = await db.collections. n.aggregate([
{ $match: fullQuery },
{$group: {_id: groupQuery, count:{$sum:1}}},
{$group: {_id:{prepaid:"$_id.prepaid",ownRent:"$_id.ownRent",ethnicity:{$push:{"eth":"$_id.hhEthGrp", "count":"$count"}}}}},
{$group:{_id:{prepaid:"$_id.prepaid"}, counts:{$push:{ownRent:"$_id.ownRent", ethnicity:"$ethnicity", count:"$count"}}}}
]).exec();
}