Как сделать многоуровневую группировку и подсчитать для полей Dynami c в Mon go DB? - PullRequest
0 голосов
/ 01 апреля 2020

Мой документ выглядит так:

{ "_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();
}
...