1+ // :replace-start: {
2+ // "terms": {
3+ // "_order": "order",
4+ // "_aggDb": "aggDb"
5+ // }
6+ // }
7+
8+ namespace Examples . Aggregation ;
9+
10+ using MongoDB . Driver ;
11+ using MongoDB . Bson ;
12+
13+ public class GroupTotal
14+ {
15+ private IMongoDatabase ? _aggDB ;
16+ private IMongoCollection < Order > ? _orders ;
17+
18+ public void LoadSampleData ( )
19+ {
20+ var uri = DotNetEnv . Env . GetString ( "CONNECTION_STRING" , "Env variable not found. Verify you have a .env file with a valid connection string." ) ;
21+ // :snippet-start: connection-string
22+ // :uncomment-start:
23+ //var uri = "mongodb+srv://mongodb-example:27017";
24+ // :uncomment-end:
25+ // :snippet-end:
26+ var client = new MongoClient ( uri ) ;
27+ _aggDB = client . GetDatabase ( "agg_tutorials_db" ) ;
28+ // :snippet-start: add-sample-data
29+ _orders = _aggDB . GetCollection < Order > ( "orders" ) ;
30+ _orders . DeleteMany ( Builders < Order > . Filter . Empty ) ;
31+
32+ _orders . InsertMany ( new List < Order >
33+ {
34+ new Order
35+ {
36+ CustomerId = "elise_smith@myemail.com" ,
37+ OrderDate = DateTime . Parse ( "2020-05-30T08:35:52Z" ) ,
38+ Value = 231
39+ } ,
40+ new Order
41+ {
42+ CustomerId = "elise_smith@myemail.com" ,
43+ OrderDate = DateTime . Parse ( "2020-01-13T09:32:07Z" ) ,
44+ Value = 99
45+ } ,
46+ new Order
47+ {
48+ CustomerId = "oranieri@warmmail.com" ,
49+ OrderDate = DateTime . Parse ( "2020-01-01T08:25:37Z" ) ,
50+ Value = 63
51+ } ,
52+ new Order
53+ {
54+ CustomerId = "tj@wheresmyemail.com" ,
55+ OrderDate = DateTime . Parse ( "2019-05-28T19:13:32Z" ) ,
56+ Value = 2
57+ } ,
58+ new Order
59+ {
60+ CustomerId = "tj@wheresmyemail.com" ,
61+ OrderDate = DateTime . Parse ( "2020-11-23T22:56:53Z" ) ,
62+ Value = 187
63+ } ,
64+ new Order
65+ {
66+ CustomerId = "tj@wheresmyemail.com" ,
67+ OrderDate = DateTime . Parse ( "2020-08-18T23:04:48Z" ) ,
68+ Value = 4
69+ } ,
70+ new Order
71+ {
72+ CustomerId = "elise_smith@myemail.com" ,
73+ OrderDate = DateTime . Parse ( "2020-12-26T08:55:46Z" ) ,
74+ Value = 4
75+ } ,
76+ new Order
77+ {
78+ CustomerId = "tj@wheresmyemail.com" ,
79+ OrderDate = DateTime . Parse ( "2021-02-28T07:49:32Z" ) ,
80+ Value = 1024
81+ } ,
82+ new Order
83+ {
84+ CustomerId = "elise_smith@myemail.com" ,
85+ OrderDate = DateTime . Parse ( "2020-10-03T13:49:44Z" ) ,
86+ Value = 102
87+ }
88+ } ) ;
89+ // :snippet-end:
90+ }
91+
92+ public List < BsonDocument > PerformAggregation ( )
93+ {
94+ if ( _aggDB == null || _orders == null )
95+ {
96+ throw new InvalidOperationException ( "You must call LoadSampleData before performing aggregation." ) ;
97+ }
98+
99+ // :snippet-start: match
100+ var results = _orders . Aggregate ( )
101+ . Match ( o => o . OrderDate >= DateTime . Parse ( "2020-01-01T00:00:00Z" ) && o . OrderDate < DateTime . Parse ( "2021-01-01T00:00:00Z" ) )
102+ // :snippet-end:
103+ // :snippet-start: sort-order-date
104+ . SortBy ( o => o . OrderDate )
105+ // :snippet-end:
106+ // :snippet-start: group
107+ . Group (
108+ o => o . CustomerId ,
109+ g => new
110+ {
111+ CustomerId = g . Key ,
112+ FirstPurchaseDate = g . First ( ) . OrderDate ,
113+ TotalValue = g . Sum ( i => i . Value ) ,
114+ TotalOrders = g . Count ( ) ,
115+ Orders = g . Select ( i => new { i . OrderDate , i . Value } ) . ToList ( )
116+ }
117+ )
118+ // :snippet-end:
119+ // :snippet-start: sort-first-order
120+ . SortBy ( c => c . FirstPurchaseDate )
121+ . As < BsonDocument > ( ) ;
122+ // :snippet-end:
123+
124+ foreach ( var result in results . ToList ( ) )
125+ {
126+ Console . WriteLine ( result ) ;
127+ }
128+
129+ return results . ToList ( ) ;
130+ }
131+ }
132+ // :replace-end:
0 commit comments