> Portal Navigation: > > - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version. > - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages). > - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`). > - Top-level index of all portals: https://dev.wix.com/docs/llms.txt > - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt # Method name: group(propertyName: Array) # Method package: wixData # Method menu location: wixData --> WixDataAggregate --> group # Method Link: https://dev.wix.com/docs/velo/apis/wix-data/wix-data-aggregate/group.md # Method Description: Groups items together in an aggregation. The `group()` function refines a `WixDataAggregate` so that its items are grouped by the specified property or properties. You can perform aggregations on the groups using the following functions: + [`avg()`](#avg) + [`count()`](#count) + [`max()`](#max) + [`min()`](#min) + [`sum()`](#sum) To filter grouped results, use the [`having()`](#having) function. > **Notes:** > + Aggregations can only be used on collections you have created. They cannot be used on [Wix App Collections](https://dev.wix.com/docs/develop-websites/articles/databases/wix-data/collections/working-with-wix-app-collections-and-code.md). > + You can only call the `group()` function once per aggregate query. # Method Code Examples: *** Note: do not assume any prop names or enum values other than the ones in the example. ## Group items in an aggregation ```javascript let newAggregate = aggregate.group("state"); ``` ## Group items by multiple fields in an aggregation ```javascript let newAggregate = aggregate.group("state", "year"); ``` ## Group items in an aggregation and run the aggregation ```javascript import wixData from 'wix-data'; // ... wixData.aggregate("PopulationData") .group("state") .max("population") .run() .then((results) => { if (results.items.length > 0) { let items = results.items; // see below let numItems = results.length; // 3 let hasNext = results.hasNext(); // false } else { // handle case where no matching items found } }) .catch((error) => { let errorMsg = error.message; let code = error.code; }); /* Given the sample data above, items is: * [ * {"_id": "FL", "populationMax": 401000}, * {"_id": "CA", "populationMax": 3796000}, * {"_id": "NY", "populationMax": 8192000} * ] */ ``` ## Group items in an aggregation and run the aggregation ```javascript import wixData from 'wix-data'; // ... wixData.aggregate("PopulationData") .group("state", "year") .max("population") .run() .then((results) => { if (results.items.length > 0) { let items = results.items; // see below let numItems = results.length; // 6 let hasNext = results.hasNext(); // false } else { // handle case where no matching items found } }) .catch((error) => { let errorMsg = error.message; let code = error.code; }); /* Given the sample data above, items is: * [ * { * "_id": {"state": "NY", "year": 2000}, * "populationMax": 8015000, * "state": "NY", * "year": 2000 * }, * { * "_id": {"state": "FL", "year": 2000}, * "populationMax": 362000, * "state": "FL", * "year": 2000 * }, * { * "_id": {"state": "NY", "year": 2010}, * "populationMax": 8192000, * "state": "NY", * "year": 2010 * }, * { * "_id": {"state": "CA", "year": 2010}, * "populationMax": 3796000, * "state": "CA", * "year": 2010 * }, * { * "_id": {"state": "CA", "year": 2000}, * "populationMax": 3703000, * "state": "CA", * "year": 2000 * }, * { * "_id": {"state": "FL", "year": 2010}, * "populationMax": 401000, * "state": "FL", * "year": 2010 * } * ] */ ``` ## Create an aggregation with filtering and grouping and run it ```javascript import wixData from 'wix-data'; // ... const filter = wixData.filter().eq("year", 2010); const having = wixData.filter().gt("maxPopulation", 1000000); wixData.aggregate("PopulationData") .filter(filter) .group("state") .max("population", "maxPopulation") .having(having) .descending("maxPopulation") .skip(5) .limit(3) .run() .then((results) => { if (results.items.length > 0) { let items = results.items; let numItems = results.length; let hasNext = results.hasNext(); } else { // handle case where no matching items found } }) .catch((error) => { let errorMsg = error.message; let code = error.code; }); ``` ---