[{"data":1,"prerenderedAt":973},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Faggregate-queries":123,"\u002Fguides\u002Faggregate-queries-surround":968},[4,9,31,107,118],{"title":5,"path":6,"stem":7,"icon":8},"Getting started","\u002Fgetting-started","01.getting-started","i-tabler-rocket",{"title":10,"icon":11,"path":12,"stem":13,"children":14,"page":30},"Concepts","i-tabler-code","\u002Fconcepts","02.concepts",[15,20,25],{"title":16,"path":17,"stem":18,"icon":19},"Architecture","\u002Fconcepts\u002Farchitecture","02.concepts\u002Farchitecture","i-tabler-sitemap",{"title":21,"path":22,"stem":23,"icon":24},"Metadata and registry","\u002Fconcepts\u002Fmetadata-and-registry","02.concepts\u002Fmetadata-and-registry","i-tabler-schema",{"title":26,"path":27,"stem":28,"icon":29},"Query Engine","\u002Fconcepts\u002Fquery-engine","02.concepts\u002Fquery-engine","i-tabler-engine",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"Guide","i-tabler-arrow-ramp-right","\u002Fguides","03.guides",[37,42,47,52,57,62,67,72,77,82,87,92,97,102],{"title":38,"path":39,"stem":40,"icon":41},"Aggregate queries","\u002Fguides\u002Faggregate-queries","03.guides\u002Faggregate-queries","i-tabler-chart-histogram",{"title":43,"path":44,"stem":45,"icon":46},"Audit Log","\u002Fguides\u002Faudit-log","03.guides\u002Faudit-log","i-tabler-history",{"title":48,"path":49,"stem":50,"icon":51},"Cursor pagination","\u002Fguides\u002Fcursor-pagination","03.guides\u002Fcursor-pagination","i-tabler-arrow-bar-to-down",{"title":53,"path":54,"stem":55,"icon":56},"Domain Events","\u002Fguides\u002Fdomain-events","03.guides\u002Fdomain-events","i-tabler-broadcast",{"title":58,"path":59,"stem":60,"icon":61},"Field transforms","\u002Fguides\u002Ffield-transforms","03.guides\u002Ffield-transforms","i-tabler-transform",{"title":63,"path":64,"stem":65,"icon":66},"Field visibility","\u002Fguides\u002Ffield-visibility","03.guides\u002Ffield-visibility","i-tabler-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Lifecycle hooks","\u002Fguides\u002Flifecycle-hooks","03.guides\u002Flifecycle-hooks","i-tabler-arrows-split",{"title":73,"path":74,"stem":75,"icon":76},"Migrations","\u002Fguides\u002Fmigrations","03.guides\u002Fmigrations","i-tabler-database-export",{"title":78,"path":79,"stem":80,"icon":81},"Optimistic locking","\u002Fguides\u002Foptimistic-locking","03.guides\u002Foptimistic-locking","i-tabler-lock-check",{"title":83,"path":84,"stem":85,"icon":86},"Production playground","\u002Fguides\u002Fplayground","03.guides\u002Fplayground","i-tabler-flask",{"title":88,"path":89,"stem":90,"icon":91},"Queries and filters","\u002Fguides\u002Fqueries-and-filters","03.guides\u002Fqueries-and-filters","i-tabler-filter",{"title":93,"path":94,"stem":95,"icon":96},"Relations","\u002Fguides\u002Frelations","03.guides\u002Frelations","i-tabler-link",{"title":98,"path":99,"stem":100,"icon":101},"Schema consistency","\u002Fguides\u002Fschema-consistency","03.guides\u002Fschema-consistency","i-tabler-database-search",{"title":103,"path":104,"stem":105,"icon":106},"Validation","\u002Fguides\u002Fvalidation","03.guides\u002Fvalidation","i-tabler-checkup-list",{"title":108,"icon":109,"path":110,"stem":111,"children":112,"page":30},"Adapters","i-tabler-plug","\u002Fadapters","04.adapters",[113],{"title":114,"path":115,"stem":116,"icon":117},"PostgreSQL adapter","\u002Fadapters\u002Fpostgresql","04.adapters\u002Fpostgresql","i-simple-icons-postgresql",{"title":119,"path":120,"stem":121,"icon":122},"Current limitations","\u002Fcurrent-limitations","05.current-limitations","i-tabler-circle-dashed-x",{"id":124,"title":38,"body":125,"description":961,"extension":962,"links":963,"meta":964,"navigation":965,"path":39,"seo":966,"stem":40,"__hash__":967},"docs\u002F03.guides\u002Faggregate-queries.md",{"type":126,"value":127,"toc":956},"minimark",[128,137,142,513,543,550,554,712,715,873,887,921,931,935,946,952],[129,130,131,132,136],"p",{},"Aggregate queries compute summaries in the database without loading every\nentity into application memory. The API is adapter-neutral; ",[133,134,135],"code",{},"PostgreAdapter","\ntranslates it into native aggregate SQL.",[138,139,141],"h2",{"id":140},"global-metrics","Global metrics",[143,144,149],"pre",{"className":145,"code":146,"language":147,"meta":148,"style":148},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const [summary] = await engine.aggregate('orders', {\n  where: {\n    conditions: [{ field: 'status', operator: 'eq', value: 'paid' }]\n  },\n  metrics: {\n    orderCount: { function: 'count' },\n    revenue: { function: 'sum', field: 'amount' },\n    averageOrder: { function: 'avg', field: 'amount' },\n    smallestOrder: { function: 'min', field: 'amount' },\n    largestOrder: { function: 'max', field: 'amount' },\n    orderIds: { function: 'collect', field: 'id' }\n  }\n})\n","ts","",[133,150,151,206,218,278,284,294,320,356,391,426,461,498,504],{"__ignoreMap":148},[152,153,156,160,164,168,171,174,178,181,184,188,191,194,198,200,203],"span",{"class":154,"line":155},"line",1,[152,157,159],{"class":158},"spNyl","const",[152,161,163],{"class":162},"sMK4o"," [",[152,165,167],{"class":166},"sTEyZ","summary",[152,169,170],{"class":162},"]",[152,172,173],{"class":162}," =",[152,175,177],{"class":176},"s7zQu"," await",[152,179,180],{"class":166}," engine",[152,182,183],{"class":162},".",[152,185,187],{"class":186},"s2Zo4","aggregate",[152,189,190],{"class":166},"(",[152,192,193],{"class":162},"'",[152,195,197],{"class":196},"sfazB","orders",[152,199,193],{"class":162},[152,201,202],{"class":162},",",[152,204,205],{"class":162}," {\n",[152,207,209,213,216],{"class":154,"line":208},2,[152,210,212],{"class":211},"swJcz","  where",[152,214,215],{"class":162},":",[152,217,205],{"class":162},[152,219,221,224,226,228,231,234,236,239,242,244,246,249,251,253,256,258,260,263,265,267,270,272,275],{"class":154,"line":220},3,[152,222,223],{"class":211},"    conditions",[152,225,215],{"class":162},[152,227,163],{"class":166},[152,229,230],{"class":162},"{",[152,232,233],{"class":211}," field",[152,235,215],{"class":162},[152,237,238],{"class":162}," '",[152,240,241],{"class":196},"status",[152,243,193],{"class":162},[152,245,202],{"class":162},[152,247,248],{"class":211}," operator",[152,250,215],{"class":162},[152,252,238],{"class":162},[152,254,255],{"class":196},"eq",[152,257,193],{"class":162},[152,259,202],{"class":162},[152,261,262],{"class":211}," value",[152,264,215],{"class":162},[152,266,238],{"class":162},[152,268,269],{"class":196},"paid",[152,271,193],{"class":162},[152,273,274],{"class":162}," }",[152,276,277],{"class":166},"]\n",[152,279,281],{"class":154,"line":280},4,[152,282,283],{"class":162},"  },\n",[152,285,287,290,292],{"class":154,"line":286},5,[152,288,289],{"class":211},"  metrics",[152,291,215],{"class":162},[152,293,205],{"class":162},[152,295,297,300,302,305,308,310,312,315,317],{"class":154,"line":296},6,[152,298,299],{"class":211},"    orderCount",[152,301,215],{"class":162},[152,303,304],{"class":162}," {",[152,306,307],{"class":211}," function",[152,309,215],{"class":162},[152,311,238],{"class":162},[152,313,314],{"class":196},"count",[152,316,193],{"class":162},[152,318,319],{"class":162}," },\n",[152,321,323,326,328,330,332,334,336,339,341,343,345,347,349,352,354],{"class":154,"line":322},7,[152,324,325],{"class":211},"    revenue",[152,327,215],{"class":162},[152,329,304],{"class":162},[152,331,307],{"class":211},[152,333,215],{"class":162},[152,335,238],{"class":162},[152,337,338],{"class":196},"sum",[152,340,193],{"class":162},[152,342,202],{"class":162},[152,344,233],{"class":211},[152,346,215],{"class":162},[152,348,238],{"class":162},[152,350,351],{"class":196},"amount",[152,353,193],{"class":162},[152,355,319],{"class":162},[152,357,359,362,364,366,368,370,372,375,377,379,381,383,385,387,389],{"class":154,"line":358},8,[152,360,361],{"class":211},"    averageOrder",[152,363,215],{"class":162},[152,365,304],{"class":162},[152,367,307],{"class":211},[152,369,215],{"class":162},[152,371,238],{"class":162},[152,373,374],{"class":196},"avg",[152,376,193],{"class":162},[152,378,202],{"class":162},[152,380,233],{"class":211},[152,382,215],{"class":162},[152,384,238],{"class":162},[152,386,351],{"class":196},[152,388,193],{"class":162},[152,390,319],{"class":162},[152,392,394,397,399,401,403,405,407,410,412,414,416,418,420,422,424],{"class":154,"line":393},9,[152,395,396],{"class":211},"    smallestOrder",[152,398,215],{"class":162},[152,400,304],{"class":162},[152,402,307],{"class":211},[152,404,215],{"class":162},[152,406,238],{"class":162},[152,408,409],{"class":196},"min",[152,411,193],{"class":162},[152,413,202],{"class":162},[152,415,233],{"class":211},[152,417,215],{"class":162},[152,419,238],{"class":162},[152,421,351],{"class":196},[152,423,193],{"class":162},[152,425,319],{"class":162},[152,427,429,432,434,436,438,440,442,445,447,449,451,453,455,457,459],{"class":154,"line":428},10,[152,430,431],{"class":211},"    largestOrder",[152,433,215],{"class":162},[152,435,304],{"class":162},[152,437,307],{"class":211},[152,439,215],{"class":162},[152,441,238],{"class":162},[152,443,444],{"class":196},"max",[152,446,193],{"class":162},[152,448,202],{"class":162},[152,450,233],{"class":211},[152,452,215],{"class":162},[152,454,238],{"class":162},[152,456,351],{"class":196},[152,458,193],{"class":162},[152,460,319],{"class":162},[152,462,464,467,469,471,473,475,477,480,482,484,486,488,490,493,495],{"class":154,"line":463},11,[152,465,466],{"class":211},"    orderIds",[152,468,215],{"class":162},[152,470,304],{"class":162},[152,472,307],{"class":211},[152,474,215],{"class":162},[152,476,238],{"class":162},[152,478,479],{"class":196},"collect",[152,481,193],{"class":162},[152,483,202],{"class":162},[152,485,233],{"class":211},[152,487,215],{"class":162},[152,489,238],{"class":162},[152,491,492],{"class":196},"id",[152,494,193],{"class":162},[152,496,497],{"class":162}," }\n",[152,499,501],{"class":154,"line":500},12,[152,502,503],{"class":162},"  }\n",[152,505,507,510],{"class":154,"line":506},13,[152,508,509],{"class":162},"}",[152,511,512],{"class":166},")\n",[129,514,515,516,518,519,522,523,525,526,528,529,532,533,525,536,539,540,542],{},"Omitting the field from ",[133,517,314],{}," produces ",[133,520,521],{},"COUNT(*)",". The other functions\nrequire a field. ",[133,524,338],{}," and ",[133,527,374],{}," accept only ",[133,530,531],{},"integer",", ",[133,534,535],{},"bigint",[133,537,538],{},"decimal","\nmetadata fields. ",[133,541,479],{}," gathers the selected field from every matching row\ninto an array.\nThe order of collected values is not guaranteed.",[129,544,545,546,549],{},"The method always returns an array. Without ",[133,547,548],{},"groupBy",", it normally contains a\nsingle summary row. Aggregate numeric values may be numbers, bigints or strings\ndepending on the database type and adapter, so applications should narrow or\nconvert them deliberately.",[138,551,553],{"id":552},"group-results","Group results",[143,555,557],{"className":145,"code":556,"language":147,"meta":148,"style":148},"const rows = await engine.aggregate('orders', {\n  groupBy: ['status'],\n  metrics: {\n    orderCount: { function: 'count' },\n    revenue: { function: 'sum', field: 'amount' },\n    users: { function: 'collect', field: 'id' }\n  }\n})\n",[133,558,559,589,609,617,637,669,702,706],{"__ignoreMap":148},[152,560,561,563,566,569,571,573,575,577,579,581,583,585,587],{"class":154,"line":155},[152,562,159],{"class":158},[152,564,565],{"class":166}," rows ",[152,567,568],{"class":162},"=",[152,570,177],{"class":176},[152,572,180],{"class":166},[152,574,183],{"class":162},[152,576,187],{"class":186},[152,578,190],{"class":166},[152,580,193],{"class":162},[152,582,197],{"class":196},[152,584,193],{"class":162},[152,586,202],{"class":162},[152,588,205],{"class":162},[152,590,591,594,596,598,600,602,604,606],{"class":154,"line":208},[152,592,593],{"class":211},"  groupBy",[152,595,215],{"class":162},[152,597,163],{"class":166},[152,599,193],{"class":162},[152,601,241],{"class":196},[152,603,193],{"class":162},[152,605,170],{"class":166},[152,607,608],{"class":162},",\n",[152,610,611,613,615],{"class":154,"line":220},[152,612,289],{"class":211},[152,614,215],{"class":162},[152,616,205],{"class":162},[152,618,619,621,623,625,627,629,631,633,635],{"class":154,"line":280},[152,620,299],{"class":211},[152,622,215],{"class":162},[152,624,304],{"class":162},[152,626,307],{"class":211},[152,628,215],{"class":162},[152,630,238],{"class":162},[152,632,314],{"class":196},[152,634,193],{"class":162},[152,636,319],{"class":162},[152,638,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667],{"class":154,"line":286},[152,640,325],{"class":211},[152,642,215],{"class":162},[152,644,304],{"class":162},[152,646,307],{"class":211},[152,648,215],{"class":162},[152,650,238],{"class":162},[152,652,338],{"class":196},[152,654,193],{"class":162},[152,656,202],{"class":162},[152,658,233],{"class":211},[152,660,215],{"class":162},[152,662,238],{"class":162},[152,664,351],{"class":196},[152,666,193],{"class":162},[152,668,319],{"class":162},[152,670,671,674,676,678,680,682,684,686,688,690,692,694,696,698,700],{"class":154,"line":296},[152,672,673],{"class":211},"    users",[152,675,215],{"class":162},[152,677,304],{"class":162},[152,679,307],{"class":211},[152,681,215],{"class":162},[152,683,238],{"class":162},[152,685,479],{"class":196},[152,687,193],{"class":162},[152,689,202],{"class":162},[152,691,233],{"class":211},[152,693,215],{"class":162},[152,695,238],{"class":162},[152,697,492],{"class":196},[152,699,193],{"class":162},[152,701,497],{"class":162},[152,703,704],{"class":154,"line":322},[152,705,503],{"class":162},[152,707,708,710],{"class":154,"line":358},[152,709,509],{"class":162},[152,711,512],{"class":166},[129,713,714],{},"Each result includes the logical grouping fields alongside the requested\nmetric aliases:",[143,716,718],{"className":145,"code":717,"language":147,"meta":148,"style":148},"[\n  {\n    status: 'paid',\n    orderCount: 2,\n    revenue: '540.50',\n    users: ['order-1', 'order-2']\n  },\n  {\n    status: 'pending',\n    orderCount: 1,\n    revenue: '75.00',\n    users: ['order-3']\n  }\n]\n",[133,719,720,725,730,745,757,772,798,802,806,821,832,847,864,868],{"__ignoreMap":148},[152,721,722],{"class":154,"line":155},[152,723,724],{"class":166},"[\n",[152,726,727],{"class":154,"line":208},[152,728,729],{"class":162},"  {\n",[152,731,732,735,737,739,741,743],{"class":154,"line":220},[152,733,734],{"class":211},"    status",[152,736,215],{"class":162},[152,738,238],{"class":162},[152,740,269],{"class":196},[152,742,193],{"class":162},[152,744,608],{"class":162},[152,746,747,749,751,755],{"class":154,"line":280},[152,748,299],{"class":211},[152,750,215],{"class":162},[152,752,754],{"class":753},"sbssI"," 2",[152,756,608],{"class":162},[152,758,759,761,763,765,768,770],{"class":154,"line":286},[152,760,325],{"class":211},[152,762,215],{"class":162},[152,764,238],{"class":162},[152,766,767],{"class":196},"540.50",[152,769,193],{"class":162},[152,771,608],{"class":162},[152,773,774,776,778,780,782,785,787,789,791,794,796],{"class":154,"line":296},[152,775,673],{"class":211},[152,777,215],{"class":162},[152,779,163],{"class":166},[152,781,193],{"class":162},[152,783,784],{"class":196},"order-1",[152,786,193],{"class":162},[152,788,202],{"class":162},[152,790,238],{"class":162},[152,792,793],{"class":196},"order-2",[152,795,193],{"class":162},[152,797,277],{"class":166},[152,799,800],{"class":154,"line":322},[152,801,283],{"class":162},[152,803,804],{"class":154,"line":358},[152,805,729],{"class":162},[152,807,808,810,812,814,817,819],{"class":154,"line":393},[152,809,734],{"class":211},[152,811,215],{"class":162},[152,813,238],{"class":162},[152,815,816],{"class":196},"pending",[152,818,193],{"class":162},[152,820,608],{"class":162},[152,822,823,825,827,830],{"class":154,"line":428},[152,824,299],{"class":211},[152,826,215],{"class":162},[152,828,829],{"class":753}," 1",[152,831,608],{"class":162},[152,833,834,836,838,840,843,845],{"class":154,"line":463},[152,835,325],{"class":211},[152,837,215],{"class":162},[152,839,238],{"class":162},[152,841,842],{"class":196},"75.00",[152,844,193],{"class":162},[152,846,608],{"class":162},[152,848,849,851,853,855,857,860,862],{"class":154,"line":500},[152,850,673],{"class":211},[152,852,215],{"class":162},[152,854,163],{"class":166},[152,856,193],{"class":162},[152,858,859],{"class":196},"order-3",[152,861,193],{"class":162},[152,863,277],{"class":166},[152,865,866],{"class":154,"line":506},[152,867,503],{"class":162},[152,869,871],{"class":154,"line":870},14,[152,872,277],{"class":166},[129,874,875,876,879,880,882,883,886],{},"The metric alias is arbitrary. In this example the ",[133,877,878],{},"users"," property contains\nthe ",[133,881,492],{}," value of every order in the corresponding status group. A more\ndescriptive alias such as ",[133,884,885],{},"orderIds"," can be used in the same way:",[143,888,890],{"className":145,"code":889,"language":147,"meta":148,"style":148},"orderIds: { function: 'collect', field: 'id' }\n",[133,891,892],{"__ignoreMap":148},[152,893,894,897,899,901,903,906,908,911,914,916,918],{"class":154,"line":155},[152,895,885],{"class":896},"sBMFI",[152,898,215],{"class":162},[152,900,304],{"class":162},[152,902,307],{"class":158},[152,904,905],{"class":211},": '",[152,907,479],{"class":186},[152,909,910],{"class":211},"', ",[152,912,913],{"class":186},"field",[152,915,905],{"class":211},[152,917,492],{"class":186},[152,919,920],{"class":211},"' }\n",[129,922,923,924,927,928,183],{},"Filters use the same ",[133,925,926],{},"QueryFilter"," structure as ",[133,929,930],{},"findMany()",[138,932,934],{"id":933},"validation-and-visibility","Validation and visibility",[129,936,937,938,941,942,945],{},"Persistence validates group fields, metric fields, aliases and numeric\noperations before calling the adapter. Fields declared with ",[133,939,940],{},"hidden"," or\ndynamic ",[133,943,944],{},"visibility"," cannot be grouped or aggregated because aggregate rows do\nnot represent individual entities on which visibility resolvers could run.",[129,947,948,949,183],{},"Adapters without native aggregate support fail explicitly with\n",[133,950,951],{},"AggregateQueriesNotSupportedError",[953,954,955],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":148,"searchDepth":155,"depth":208,"links":957},[958,959,960],{"id":140,"depth":208,"text":141},{"id":552,"depth":208,"text":553},{"id":933,"depth":208,"text":934},"Count, summarize and group persisted data through the Query Engine.","md",null,{},{"icon":41},{"title":38,"description":961},"WtTiyg_Rx1diOTmYj-WzNnaAueh5uZbQO7Ip_Gf6CAo",[969,971],{"title":26,"path":27,"stem":28,"description":970,"icon":29,"children":-1},"Execute typed reads, safe mutations and application transactions.",{"title":43,"path":44,"stem":45,"description":972,"icon":46,"children":-1},"Record transactional mutation history with actors and field changes.",1783964085627]