{"id":45206,"date":"2026-06-24T00:38:36","date_gmt":"2026-06-23T22:38:36","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=45206"},"modified":"2026-06-24T00:40:43","modified_gmt":"2026-06-23T22:40:43","slug":"m-files-bd-aggregations-reducers-and-series","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/","title":{"rendered":"M-Files BD &#8211; Aggregations, reducers and series"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In the <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-queries-objecttype-class-filters-date-tokens\/\" target=\"_blank\" rel=\"noreferrer noopener\">previous post<\/a>, I walked through the query side of the dashboard JSON: <strong><em>objectType<\/em><\/strong>, <strong><em>class<\/em><\/strong>, <strong><em>filters<\/em><\/strong>, <strong><em>date tokens<\/em><\/strong>. What I deliberately left out was the <strong><em>aggregation<\/em><\/strong> block, because it deserves its own post.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The aggregation is what transforms the set of matching objects into a value the widget can render. There are five aggregation types, six reducers, and one optional second dimension (<strong><em>seriesProperty<\/em><\/strong>). Together, they cover every widget shape from a single KPI number to a cross-tab pivot table.<\/p>\n\n\n\n<h2 id=\"h-1-the-two-dimensional-model\" class=\"wp-block-heading\">1. The two-dimensional model<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The aggregation has two complementary components:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The aggregation <strong><em>type<\/em><\/strong> is the <strong>shape<\/strong> of the result: one value (<strong><em>summary<\/em><\/strong>), one value per group (<strong><em>groupByProperty<\/em><\/strong>), one value per time bucket (<strong><em>groupByDateBucket<\/em><\/strong>), one value per admin-defined range (<strong><em>groupByRange<\/em><\/strong>), or a simple list of objects (<strong><em>list<\/em><\/strong>).<\/li>\n\n\n\n<li>The aggregation <strong><em>reducer<\/em><\/strong> is the <strong>operation<\/strong> applied within each group (or over the whole matching set for <strong><em>summary<\/em><\/strong>): <strong><em>count<\/em><\/strong> (default), <strong><em>sum<\/em><\/strong>, <strong><em>avg<\/em><\/strong>, <strong><em>min<\/em><\/strong>, <strong><em>max<\/em><\/strong>, <strong><em>median<\/em><\/strong>. Note: The reducer is ignored for <strong><em>list<\/em><\/strong>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In other words, <strong><em>type<\/em><\/strong> decides whether you get a number, a chart, or a table; <strong><em>reducer<\/em><\/strong> decides what that number, bar, or cell actually measures.<\/p>\n\n\n\n<h2 id=\"h-2-the-five-aggregation-types\" class=\"wp-block-heading\">2. The five aggregation types<\/h2>\n\n\n\n<h3 id=\"h-2-1-summary-one-value-over-everything\" class=\"wp-block-heading\">2.1. summary &#8211; one value over everything<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>summary<\/em><\/strong> reduces the entire matching set into a single value. By default it counts the matching objects. However, with a different reducer, you can make it compute a property aggregate in different ways. Here are a few example of summary aggregations:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/ Total count of matching objects\n&quot;aggregation&quot;: { &quot;type&quot;: &quot;summary&quot; }\n\n\/\/ Total revenue of matching objects\n\/\/ (sum all values from the &quot;Amount&quot; property)\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;summary&quot;,\n  &quot;reducer&quot;: &quot;sum&quot;,\n  &quot;reducerProperty&quot;: &quot;Amount&quot;\n}\n\n\/\/ Latest contract expiry date\n\/\/ (display only the date with the highest value - drill-through still list all objects)\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;summary&quot;,\n  &quot;reducer&quot;: &quot;max&quot;,\n  &quot;reducerProperty&quot;: &quot;Effective through&quot;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The widgets that accept <strong><em>summary<\/em><\/strong> are <strong><em>kpiNumber<\/em><\/strong>, <strong><em>gauge<\/em><\/strong>, and <strong><em>table<\/em><\/strong>. If you followed this series, you probably saw a bunch of the first two, already. The last one, in this case, will render the value as a one-row table. For all other chart widgets (donut, bar, line, area), <strong><em>summary<\/em><\/strong> does not really make visual sense, as a single value cannot be plotted on an X-Y axis.<\/p>\n\n\n\n<h3 id=\"h-2-2-groupbyproperty-one-value-per-group\" class=\"wp-block-heading\">2.2. groupByProperty &#8211; one value per group<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>groupByProperty<\/em><\/strong> groups objects by the distinct values of a property (the <strong><em>propertyName<\/em><\/strong>) and applies the reducer to each group independently. Here are two examples:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/ Count of matching objects per Agreement type\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByProperty&quot;,\n  &quot;propertyName&quot;: &quot;Agreement type&quot;,\n  &quot;includeEmptyResults&quot;: &quot;No&quot;\n}\n\n\/\/ Total revenue of matching objects per Customer\n\/\/ (sum all values from the &quot;Amount&quot; property for each Customer independently)\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByProperty&quot;,\n  &quot;propertyName&quot;: &quot;Customer&quot;,\n  &quot;reducer&quot;: &quot;sum&quot;,\n  &quot;reducerProperty&quot;: &quot;Amount&quot;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The supported fields are the following ones:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Required<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><strong><em>propertyName<\/em><\/strong><\/td><td>Yes<\/td><td>Property to group by (any type is supported)<\/td><\/tr><tr><td><strong><em>reducer<\/em><\/strong><\/td><td>No<\/td><td>Defaults to <strong><em>count<\/em><\/strong> (c.f. section 1 above)<\/td><\/tr><tr><td><strong><em>reducerProperty<\/em><\/strong><\/td><td>Yes, when reducer != count<\/td><td>Property to reduce within each group. Can be the same as <strong><em>propertyName<\/em><\/strong> but it can also be different (c.f. above)<\/td><\/tr><tr><td><strong><em>includeEmptyResults<\/em><\/strong><\/td><td>No<\/td><td>When set to <strong><em>&#8220;Yes&#8221;<\/em><\/strong>, it adds a <strong><em>(none)<\/em><\/strong> group which will contain objects without value (e.g. no value for &#8220;Customer&#8221; property)<\/td><\/tr><tr><td><strong><em>seriesProperty<\/em><\/strong><\/td><td>No<\/td><td>Splits the chart into multiple series (c.f. section 4 below)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The widgets that accept <strong><em>groupByProperty<\/em><\/strong> are <strong><em>donut<\/em><\/strong>, <strong><em>bar<\/em><\/strong>, <strong><em>line<\/em><\/strong>, <strong><em>area<\/em><\/strong> and <strong><em>table<\/em><\/strong>. Basically, all charts widgets, plus the table which is kind of a Swiss knife, that works with everything.<\/p>\n\n\n\n<h3 id=\"h-2-3-groupbydatebucket-one-value-per-time-period\" class=\"wp-block-heading\">2.3. groupByDateBucket &#8211; one value per time period<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It is very similar to the <strong><em>groupByProperty<\/em><\/strong>, but the target must be a date \/ timestamp. Basically, something that contains a date, whether its only the date or a full date-time is fine. Because dates would probably be a bit too wide, there is a concept of buckets, to group dates by a pre-defined range that might make sense. The default time periods are <strong><em>day<\/em><\/strong>, <strong><em>week<\/em><\/strong>, <strong><em>month<\/em><\/strong>, <strong><em>quarter<\/em><\/strong> or <strong><em>year<\/em><\/strong>. Here are two examples:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/ Count of contracts expiring per month\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByDateBucket&quot;,\n  &quot;propertyName&quot;: &quot;Effective through&quot;,\n  &quot;bucketSize&quot;: &quot;month&quot;,\n  &quot;includeEmptyResults&quot;: &quot;Yes&quot;\n}\n\n\/\/ Sum of invoice amounts per quarter\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByDateBucket&quot;,\n  &quot;propertyName&quot;: &quot;Invoice date&quot;,\n  &quot;bucketSize&quot;: &quot;quarter&quot;,\n  &quot;reducer&quot;: &quot;sum&quot;,\n  &quot;reducerProperty&quot;: &quot;Amount&quot;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The supported fields are pretty similar to the <strong><em>groupByProperty<\/em><\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Required<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><strong><em>propertyName<\/em><\/strong><\/td><td>Yes<\/td><td>Property to group by (date \/ timestamp only)<\/td><\/tr><tr><td><strong><em>bucketSize<\/em><\/strong><\/td><td>No<\/td><td>Defaults to <strong><em>month<\/em><\/strong>, the size of the range to group by<\/td><\/tr><tr><td><strong><em>reducer<\/em><\/strong><\/td><td>No<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong><\/td><\/tr><tr><td><strong><em>reducerProperty<\/em><\/strong><\/td><td>Yes, when reducer != count<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong><\/td><\/tr><tr><td><strong><em>includeEmptyResults<\/em><\/strong><\/td><td>No<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong>, but <strong><em>&#8220;Yes&#8221;<\/em><\/strong> will also fill gaps with zero values (e.g. a month without revenue is still displayed as <strong><em>&#8220;0&#8221;<\/em><\/strong>, it&#8217;s not silently ignored)<\/td><\/tr><tr><td><strong><em>seriesProperty<\/em><\/strong><\/td><td>No<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Note:<\/em><\/strong> you would usually combine <strong><em>groupByDateBucket<\/em><\/strong> with a date filter to limit the range of results. Without filters, the chart would show everything from the earliest object in the vault to the most recent, possibly spanning decades. If that&#8217;s what you want to see, then that&#8217;s absolutely fine. However, most of the time, a filter like <strong><em>between @startOfYear and @endOfYear<\/em><\/strong> for an annual trend chart might be more appropriate.<\/p>\n\n\n\n<h3 id=\"h-2-4-groupbyrange-one-value-per-admin-defined-range\" class=\"wp-block-heading\">2.4. groupByRange &#8211; one value per admin-defined range<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This one is also very similar to the last two groupings. With the main difference that this is the only one that allows you to define the exact range.<\/p>\n\n\n\n<h4 id=\"h-2-4-1-the-groupbyrange-itself\" class=\"wp-block-heading\">2.4.1 The groupByRange itself<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a certain property that has a high cardinality, it might be difficult to display it with a <strong><em>groupByProperty<\/em><\/strong>. Let&#8217;s take for example the &#8220;Amount&#8221; property from before. When you want to apply math on it (sum\/avg\/min\/max\/median), then that&#8217;s fine because it only returns one value. But if you want to see the revenue themselves, without a prior grouping on something else (e.g. above we first group by &#8220;Customer&#8221;), then you would end-up with dozens\/hundreds\/thousands of groups? That&#8217;s where <strong><em>groupByRange<\/em><\/strong> shines, because you define the grouping (e.g. 0-1&#8217;000, 1&#8217;000-5&#8217;000, &gt;=5&#8217;000).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can use that grouping method with numeric \/ time \/ text \/ lookup properties. On the other hand, date \/ timestamp and boolean aren&#8217;t supported. The reason for that is simple: there is already <strong><em>groupByDateBucket<\/em><\/strong> for date \/ timestamp, and boolean can only have 2 values (Yes \/ No), so <strong><em>groupByProperty<\/em><\/strong> works just fine.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/ Invoices by specific range\n\/\/ 3 ranges: 0-1000, 1000-5000, 5000-10000\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByRange&quot;,\n  &quot;propertyName&quot;: &quot;Amount&quot;,\n  &quot;boundaries&quot;: &#x5B;&quot;0&quot;, &quot;1000&quot;, &quot;5000&quot;, &quot;10000&quot;]\n}\n\n\/\/ Invoices by specific range, with open ranges\n\/\/ 4 ranges: 0-1000, 1000-5000, 5000-10000, &gt;=10000\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByRange&quot;,\n  &quot;propertyName&quot;: &quot;Amount&quot;,\n  &quot;boundaries&quot;: &#x5B;&quot;*&quot;, &quot;1000&quot;, &quot;5000&quot;, &quot;10000&quot;, &quot;*&quot;]\n}\n\n\/\/ Efficiency \/ speed of processing \/ duration of some actions \/ etc...\n\/\/ 4 ranges: 0-30s, 30s-1min, 1min-2min, &gt;=2min\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByRange&quot;,\n  &quot;propertyName&quot;: &quot;Duration&quot;,\n  &quot;boundaries&quot;: &#x5B;&quot;*&quot;, &quot;00:00:30&quot;, &quot;00:01:00&quot;, &quot;00:02:00&quot;, &quot;*&quot;]\n}\n\n\/\/ Customers by country name\n\/\/ 3 ranges: A-F, F-M, &gt;=M\n\/\/ e.g. &quot;France&quot; in 2nd group, Switzerland in 3rd group\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByRange&quot;,\n  &quot;propertyName&quot;: &quot;Country&quot;,\n  &quot;boundaries&quot;: &#x5B;&quot;A&quot;, &quot;F&quot;, &quot;M&quot;, &quot;*&quot;],\n  &quot;reducer&quot;: &quot;count&quot;\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Again, the supported fields are fairly similar to the <strong><em>groupByProperty<\/em><\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Required<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><strong><em>propertyName<\/em><\/strong><\/td><td>Yes<\/td><td>Property to group by (numeric \/ time \/ text \/ lookup only)<\/td><\/tr><tr><td><strong><em>boundaries<\/em><\/strong><\/td><td>Yes<\/td><td><strong>Ordered<\/strong> array of range boundary values (at least 2 values, sorted ascending, with at least 1 non &#8220;*&#8221; value)<\/td><\/tr><tr><td><strong><em>reducer<\/em><\/strong><\/td><td>No<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong><\/td><\/tr><tr><td><strong><em>reducerProperty<\/em><\/strong><\/td><td>Yes, when reducer != count<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong><\/td><\/tr><tr><td><strong><em>includeEmptyResults<\/em><\/strong><\/td><td>No<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong>, but <strong><em>&#8220;Yes&#8221;<\/em><\/strong> will also show empty ranges<\/td><\/tr><tr><td><strong><em>seriesProperty<\/em><\/strong><\/td><td>No<\/td><td>Same as <strong><em>groupByProperty<\/em><\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 id=\"h-2-4-2-how-boundaries-work\" class=\"wp-block-heading\">2.4.2. How boundaries work<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Each boundary value marks the inclusive lower bound of a range and the exclusive upper bound of the range below it, except for the last range, which is fully inclusive. For example, <code>[\"0\", \"1000\", \"5000\", \"10000\"]<\/code> creates three buckets: <code>[0, 1000)<\/code>, <code>[1000, 5000)<\/code> and <code>[5000, 10000]<\/code>. This means that a value of &#8220;1000&#8221; will end-up on the 2nd bucket only. A value of &#8220;5000&#8221; or &#8220;10000&#8221; will end-up on the 3rd bucket.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In addition, as you can see in the examples above, you can use a wildcard (<code>\"*\"<\/code>) on either end: a leading <code>\"*\"<\/code> creates a bucket for everything below the first boundary, and a trailing <code>\"*\"<\/code> creates a bucket for everything at or above the last boundary.<\/p>\n\n\n\n<h3 id=\"h-2-5-list-one-row-per-object\" class=\"wp-block-heading\">2.5. list &#8211; one row per object<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>list<\/em><\/strong> are pretty similar to search results from M-Files, in the sense that it will just list something, with pre-defined columns. When using this aggregation type, the reducers have no effect, because it only lists objects but do not apply any modifications \/ computing on them.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/ List all contracts with 3 specific columns\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;list&quot;,\n  &quot;displayProperties&quot;: &#x5B;&quot;Agreement type&quot;, &quot;Effective through&quot;, &quot;Responsible person&quot;]\n}\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>Required<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><strong><em>displayProperties<\/em><\/strong><\/td><td>No, but highly recommended<\/td><td>Name of properties to include in the table, as columns, in addition to the object name<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For simple lists, the objects will be pre-sorted alphabetically but the user is then able to re-sort them, by each of the columns displayed. When <strong><em>drillThroughEnabled<\/em><\/strong> is set to <strong><em>&#8220;Yes&#8221;<\/em><\/strong>, then table rows become clickable and allows navigation to the object in question. There is no modal\/drill-through in this case, since the table list already display the target object (no grouping).<\/p>\n\n\n\n<h2 id=\"h-3-the-six-reducers\" class=\"wp-block-heading\">3. The six reducers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As mentioned, all five aggregation types, except <strong><em>list<\/em><\/strong>, accept a <strong><em>reducer<\/em><\/strong>. You probably understand them already, but just as a quick table:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Reducer<\/th><th>What it computes<\/th><th>reducerProperty types<\/th><th>Empty set returns<\/th><\/tr><\/thead><tbody><tr><td><strong><em>count<\/em><\/strong> <em>(default)<\/em><\/td><td>Number of matching objects<\/td><td>n\/a<\/td><td><strong><em>0<\/em><\/strong><\/td><\/tr><tr><td><strong><em>sum<\/em><\/strong><\/td><td>Total of the property&#8217;s values<\/td><td>Numeric or time<\/td><td><strong><em>null<\/em><\/strong> (rendered as <strong><em>&#8211;<\/em><\/strong>)<\/td><\/tr><tr><td><strong><em>avg<\/em><\/strong><\/td><td>Arithmetic mean<\/td><td>Numeric or time<\/td><td><strong><em>null<\/em><\/strong> (rendered as <strong><em>&#8211;<\/em><\/strong>)<\/td><\/tr><tr><td><strong><em>median<\/em><\/strong><\/td><td>Middle value<\/td><td>Numeric or time<\/td><td><strong><em>null<\/em><\/strong> (rendered as <strong><em>&#8211;<\/em><\/strong>)<\/td><\/tr><tr><td><strong><em>min<\/em><\/strong><\/td><td>Smallest value<\/td><td>Numeric or date \/ timestamp \/ time<\/td><td><strong><em>null<\/em><\/strong> (rendered as <strong><em>&#8211;<\/em><\/strong>)<\/td><\/tr><tr><td><strong><em>max<\/em><\/strong><\/td><td>Largest value<\/td><td>Numeric or date \/ timestamp \/ time<\/td><td><strong><em>null<\/em><\/strong> (rendered as <strong><em>&#8211;<\/em><\/strong>)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 id=\"h-3-1-the-date-time-valued-reducer-rule\" class=\"wp-block-heading\">3.1. The date\/time-valued reducer rule<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When <strong><em>min<\/em><\/strong> or <strong><em>max<\/em><\/strong> is applied to a date, timestamp, or time property, the reducer returns the value and it will be formatted for end-users based on their localization \/ regional settings: e.g. <strong><em>DD\/MM\/YYYY<\/em><\/strong> for dates, <strong><em>DD\/MM\/YYYY HH:mm<\/em><\/strong> for timestamps (minute precision), and <strong><em>HH:mm:ss<\/em><\/strong> for times.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When <strong><em>sum<\/em><\/strong>, <strong><em>avg<\/em><\/strong> or <strong><em>median<\/em><\/strong> is applied to a time property, it allows you to compute a total (or average\/median) duration for a certain activity. This might be useful if you have time-constraints.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Three widgets can render date\/time values: <strong><em>kpiNumber<\/em><\/strong> (a single big number), <strong><em>gauge<\/em><\/strong> (switch to date mode, covered in <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-scalar-widgets-kpinumber-and-gauge\/\" target=\"_blank\" rel=\"noreferrer noopener\">Post 4a<\/a>) and <strong><em>table<\/em><\/strong> (simple display in rows).<\/p>\n\n\n\n<h2 id=\"h-4-seriesproperty-the-second-dimension\" class=\"wp-block-heading\">4. seriesProperty &#8211; the second dimension<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The series details were already covered a bit in the posts <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-trend-widgets-line-and-area\/\" target=\"_blank\" rel=\"noreferrer noopener\">4b<\/a> and <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/\" target=\"_blank\" rel=\"noreferrer noopener\">4c<\/a>. But, this is the feature that turns a single-series widget into a multi-actor comparison. When you set a <strong><em>seriesProperty<\/em><\/strong> on a <strong><em>groupBy<\/em><\/strong> aggregation, the engine will automatically produce one series per distinct value of the series property. This allows a two-dimensional comparison.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The behavior per widget type is the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>line<\/em><\/strong> \/ <strong><em>area<\/em><\/strong> &#8211; one colored line per series, with an auto-generated legend.<\/li>\n\n\n\n<li><strong><em>bar<\/em><\/strong> &#8211; one colored sub-bar per series (<strong><em>display.barLayout<\/em><\/strong> controls stacked vs grouped).<\/li>\n\n\n\n<li><strong><em>donut<\/em><\/strong> &#8211; a multi-mini-pie grid, one donut per series, with a shared legend.<\/li>\n\n\n\n<li><strong><em>table<\/em><\/strong> &#8211; a cross-tab pivot, one column per series.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">As a reminder, <strong><em>kpiNumber<\/em><\/strong> and <strong><em>gauge<\/em><\/strong> ignore <strong><em>seriesProperty<\/em><\/strong>, since they only display single-values.<\/p>\n\n\n\n<h3 id=\"h-4-1-use-low-cardinality-series-only\" class=\"wp-block-heading\">4.1. Use low-cardinality series only<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">I repeated this in every widget post but it is worth restating: <strong><em>seriesProperty<\/em><\/strong> should be <strong>low-cardinality<\/strong>. A property with five distinct values produces a readable multi-series chart. A property with two hundred values produces a colored mess. In that case, you might want to use a <strong><em>groupByRange<\/em><\/strong>, to reduce the amount of groups and therefore the series.<\/p>\n\n\n\n<h3 id=\"h-4-2-includeemptyresults-in-multi-series\" class=\"wp-block-heading\">4.2. includeEmptyResults in multi-series<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In single-series mode, <strong><em>includeEmptyResults: &#8220;Yes&#8221;<\/em><\/strong> fills empty time buckets with zero values. In multi-series mode, it does the same <strong>across both dimensions<\/strong>: every series gets a zero in any bucket where it has no data. This avoids broken lines and visually confusing gaps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The behavior also adds a <strong><em>(none)<\/em><\/strong> bucket for objects whose primary group property has no value, and a <strong><em>(none)<\/em><\/strong> series for objects whose series property has no value. These are appended at the end so it doesn&#8217;t disrupt the &#8220;main story&#8221;.<\/p>\n\n\n\n<h3 id=\"h-4-3-multi-select-lookups-in-seriesproperty-and-propertyname\" class=\"wp-block-heading\">4.3. Multi-select lookups in seriesProperty (and propertyName)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A subtle but important case: as you probably know, M-Files has a <strong>multi-select lookup<\/strong> property type. These allow the selection of multiple pre-defined values. Because of that, objects with multiple values will end-up in multiple buckets\/groups, with the &#8220;counted once per value&#8221; rule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example: a customer with office locations in Geneva, Zurich and Berlin could appear three times, once for a Geneva bucket, once for a Zurich bucket and finally once for a Berlin bucket. The total of all bucket counts can therefore exceed the total number of objects when some objects have multiple values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the correct and expected behavior for multi-select lookups. The alternative (counting each object only in its first value) would silently hide the multi-value relationships that often matter most.<\/p>\n\n\n\n<h2 id=\"h-5-displayproperties-on-drill-through\" class=\"wp-block-heading\">5. displayProperties on drill-through<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I mentioned <strong><em>displayProperties<\/em><\/strong> in section 2.5 above, as optional column to be added for <strong><em>list<\/em><\/strong> aggregations. The same field has a second role for all other aggregation type (<strong><em>summary<\/em><\/strong>, <strong><em>groupByProperty<\/em><\/strong>, <strong><em>groupByDateBucket<\/em><\/strong>, <strong><em>groupByRange<\/em><\/strong>): it controls <strong>the columns in the drill-through modal<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n&quot;aggregation&quot;: {\n  &quot;type&quot;: &quot;groupByProperty&quot;,\n  &quot;propertyName&quot;: &quot;Agreement type&quot;,\n  &quot;displayProperties&quot;: &#x5B;&quot;Effective through&quot;, &quot;Responsible person&quot;]\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">When the user clicks a donut slice (or a bar, or a row in a count table), the drill-through modal shows one row per object in that group, with the object name plus all the optional columns defined in the <strong><em>displayProperties<\/em><\/strong> value (e.g. <strong><em>Effective through<\/em><\/strong> and <strong><em>Responsible person<\/em><\/strong>).<\/p>\n\n\n\n<h2 id=\"h-6-the-compatibility-cheat-sheet\" class=\"wp-block-heading\">6. The compatibility cheat sheet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I already put this table at the end of <a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-distribution-and-tabular-widgets-donut-bar-table\/\" target=\"_blank\" rel=\"noreferrer noopener\">Post 4c<\/a>, but it is short enough, so:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Widget type<\/th><th>summary<\/th><th>groupByProperty<\/th><th>groupByDateBucket<\/th><th>groupByRange<\/th><th>list<\/th><th>seriesProperty<\/th><\/tr><\/thead><tbody><tr><td><strong><em>kpiNumber<\/em><\/strong><\/td><td>yes<\/td><td>&#8211;<\/td><td>&#8211;<\/td><td>&#8211;<\/td><td>&#8211;<\/td><td>ignored<\/td><\/tr><tr><td><strong><em>gauge<\/em><\/strong><\/td><td>yes<\/td><td>&#8211;<\/td><td>&#8211;<\/td><td>&#8211;<\/td><td>&#8211;<\/td><td>ignored<\/td><\/tr><tr><td><strong><em>donut<\/em><\/strong><\/td><td>&#8211;<\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>&#8211;<\/td><td>multi-mini-pie<\/td><\/tr><tr><td><strong><em>bar<\/em><\/strong><\/td><td>&#8211;<\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>&#8211;<\/td><td>stacked or grouped<\/td><\/tr><tr><td><strong><em>line<\/em><\/strong><\/td><td>&#8211;<\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>&#8211;<\/td><td>multi-series lines<\/td><\/tr><tr><td><strong><em>area<\/em><\/strong><\/td><td>&#8211;<\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>&#8211;<\/td><td>multi-series areas<\/td><\/tr><tr><td><strong><em>table<\/em><\/strong><\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>yes<\/td><td>cross-tab pivot<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Combine this with the reducer table in section 3 and you have the full answer to &#8220;can I use aggregation X with widget Y, and with reducer Z on property type T&#8221;. In any case, the Visual Designer and the validation process will prevent you to make any mistake.<\/p>\n\n\n\n<h2 id=\"h-7-what-this-gives-you\" class=\"wp-block-heading\">7. What this gives you<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The query side (<a href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-queries-objecttype-class-filters-date-tokens\/\" target=\"_blank\" rel=\"noreferrer noopener\">Post 5<\/a>) plus the aggregation side (this post) together cover everything the engine supports. If that wasn&#8217;t the case before, you should now be able to read and understand every line from any of the previous JSON example.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The combinations are richer than they look at first. A <strong><em>groupByDateBucket<\/em><\/strong> on monthly invoices with a <strong><em>sum<\/em><\/strong> reducer on <strong><em>Amount<\/em><\/strong> and a <strong><em>seriesProperty<\/em><\/strong> on <strong><em>Customer<\/em><\/strong>, rendered as a <strong><em>line<\/em><\/strong> widget with <strong><em>includeEmptyResults: &#8220;Yes&#8221;<\/em><\/strong>, gives a multi-customer revenue trend that takes about 15 lines of JSON. A <strong><em>groupByProperty<\/em><\/strong> on <strong><em>Agreement type<\/em><\/strong> with a <strong><em>seriesProperty<\/em><\/strong> on <strong><em>Workflow state<\/em><\/strong> rendered as a <strong><em>table<\/em><\/strong> gives a cross-tab pivot with drill-through on every cell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The possibilities aren&#8217;t endless, obviously, but good luck if you would like to try them all&#8230; Last time I checked, you could create several million different widget combinations. An important part of that would trigger warnings or errors for non-supported cases, but still a considerable scale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So far, I covered the end-user part, the JSON, the widgets and now the queries. These are the building blocks of dashboards. The remaining posts of the series will cover:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Post 7 &#8211; The Admin tab: the Visual Designer and the JSON editor, how they relate, the two-stage validator, import \/ export.<\/li>\n\n\n\n<li>Post 8 &#8211; Access control, performance, and the interactive features (auto-refresh, drill-through, exports, favorites, shareable links).<\/li>\n\n\n\n<li>Posts 9a and 9b &#8211; The same Contracts dashboard built two ways: visually first, then in JSON.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Want to know more about this Business Dashboard? <a href=\"https:\/\/www.dbi-services.com\/company\/contact\/\" target=\"_blank\" rel=\"noreferrer noopener\">Contact us<\/a> and we will be happy to showcase it on <a href=\"https:\/\/www.m-files.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">M-Files<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the previous post, I walked through the query side of the dashboard JSON: objectType, class, filters, date tokens. What I deliberately left out was the aggregation block, because it deserves its own post. The aggregation is what transforms the set of matching objects into a value the widget can render. There are five aggregation [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[525],"tags":[4119,4094,3190,4120,4121],"type_dbi":[],"class_list":["post-45206","post","type-post","status-publish","format-standard","hentry","category-enterprise-content-management","tag-aggregation","tag-business-dashboard","tag-m-files","tag-reducer","tag-series"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>M-Files BD - Aggregations, reducers and series - dbi Blog<\/title>\n<meta name=\"description\" content=\"After the queries, let&#039;s look at the aggregations of the M-Files Business Dashboard: Including all types, reducers and series options.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M-Files BD - Aggregations, reducers and series\" \/>\n<meta property=\"og:description\" content=\"After the queries, let&#039;s look at the aggregations of the M-Files Business Dashboard: Including all types, reducers and series options.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-23T22:38:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-23T22:40:43+00:00\" \/>\n<meta name=\"author\" content=\"Morgan Patou\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MorganPatou\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Morgan Patou\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/\"},\"author\":{\"name\":\"Morgan Patou\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"headline\":\"M-Files BD &#8211; Aggregations, reducers and series\",\"datePublished\":\"2026-06-23T22:38:36+00:00\",\"dateModified\":\"2026-06-23T22:40:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/\"},\"wordCount\":2307,\"commentCount\":0,\"keywords\":[\"Aggregation\",\"Business Dashboard\",\"M-Files\",\"Reducer\",\"Series\"],\"articleSection\":[\"Enterprise content management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/\",\"name\":\"M-Files BD - Aggregations, reducers and series - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-06-23T22:38:36+00:00\",\"dateModified\":\"2026-06-23T22:40:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\"},\"description\":\"After the queries, let's look at the aggregations of the M-Files Business Dashboard: Including all types, reducers and series options.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/m-files-bd-aggregations-reducers-and-series\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"M-Files BD &#8211; Aggregations, reducers and series\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/c4d05b25843a9bc2ab20415dae6bd2d8\",\"name\":\"Morgan Patou\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g\",\"caption\":\"Morgan Patou\"},\"description\":\"Morgan Patou has over 15 years of experience in Digitalization &amp; Enterprise Content Management (ECM) systems, with a strong focus in recent years on platforms such as Alfresco, Documentum, and M-Files. He specializes in the architecture, setup, customization, and maintenance of ECM infrastructures in complex &amp; critical environments. Morgan is well-versed in both engineering and operations aspects, including high availability design, system integration, and lifecycle management. He also has a solid foundation in open-source and proprietary technologies - ranging from Apache HTTPD\\\/Tomcat, OpenLDAP or Kerberos to enterprise-grade systems like WebLogic. Morgan Patou holds an Engineering Degree in Computer Science from ENSISA (\u00c9cole Nationale Sup\u00e9rieure d'Ing\u00e9nieurs Sud Alsace) in Mulhouse, France. He is Alfresco Content Services Certified Administrator (ACSCA), Alfresco Content Services Certified Engineer (ACSCE) as well as OpenText Documentum Certified Administrator. His industry experience spans the Public Sector, IT Services, Financial Services\\\/Banking, and the Pharmaceutical industry.\",\"sameAs\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/morgan-patou\\\/\",\"https:\\\/\\\/x.com\\\/MorganPatou\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/morgan-patou\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"M-Files BD - Aggregations, reducers and series - dbi Blog","description":"After the queries, let's look at the aggregations of the M-Files Business Dashboard: Including all types, reducers and series options.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/","og_locale":"en_US","og_type":"article","og_title":"M-Files BD - Aggregations, reducers and series","og_description":"After the queries, let's look at the aggregations of the M-Files Business Dashboard: Including all types, reducers and series options.","og_url":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/","og_site_name":"dbi Blog","article_published_time":"2026-06-23T22:38:36+00:00","article_modified_time":"2026-06-23T22:40:43+00:00","author":"Morgan Patou","twitter_card":"summary_large_image","twitter_creator":"@MorganPatou","twitter_misc":{"Written by":"Morgan Patou","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/"},"author":{"name":"Morgan Patou","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"headline":"M-Files BD &#8211; Aggregations, reducers and series","datePublished":"2026-06-23T22:38:36+00:00","dateModified":"2026-06-23T22:40:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/"},"wordCount":2307,"commentCount":0,"keywords":["Aggregation","Business Dashboard","M-Files","Reducer","Series"],"articleSection":["Enterprise content management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/","url":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/","name":"M-Files BD - Aggregations, reducers and series - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-06-23T22:38:36+00:00","dateModified":"2026-06-23T22:40:43+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8"},"description":"After the queries, let's look at the aggregations of the M-Files Business Dashboard: Including all types, reducers and series options.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/m-files-bd-aggregations-reducers-and-series\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"M-Files BD &#8211; Aggregations, reducers and series"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/c4d05b25843a9bc2ab20415dae6bd2d8","name":"Morgan Patou","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5d7f5bec8b597db68a09107a6f5309e3870d6296ef94fb10ead4b09454ca67e5?s=96&d=mm&r=g","caption":"Morgan Patou"},"description":"Morgan Patou has over 15 years of experience in Digitalization &amp; Enterprise Content Management (ECM) systems, with a strong focus in recent years on platforms such as Alfresco, Documentum, and M-Files. He specializes in the architecture, setup, customization, and maintenance of ECM infrastructures in complex &amp; critical environments. Morgan is well-versed in both engineering and operations aspects, including high availability design, system integration, and lifecycle management. He also has a solid foundation in open-source and proprietary technologies - ranging from Apache HTTPD\/Tomcat, OpenLDAP or Kerberos to enterprise-grade systems like WebLogic. Morgan Patou holds an Engineering Degree in Computer Science from ENSISA (\u00c9cole Nationale Sup\u00e9rieure d'Ing\u00e9nieurs Sud Alsace) in Mulhouse, France. He is Alfresco Content Services Certified Administrator (ACSCA), Alfresco Content Services Certified Engineer (ACSCE) as well as OpenText Documentum Certified Administrator. His industry experience spans the Public Sector, IT Services, Financial Services\/Banking, and the Pharmaceutical industry.","sameAs":["https:\/\/www.dbi-services.com\/blog\/author\/morgan-patou\/","https:\/\/x.com\/MorganPatou"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/morgan-patou\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=45206"}],"version-history":[{"count":2,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45206\/revisions"}],"predecessor-version":[{"id":45208,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45206\/revisions\/45208"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=45206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=45206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=45206"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=45206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}