1MONGOC_AGGREGATE(3) libmongoc MONGOC_AGGREGATE(3)
2
3
4
6 mongoc_aggregate - Aggregation Framework Examples
7
8 This document provides a number of practical examples that display the
9 capabilities of the aggregation framework.
10
11 The Aggregations using the Zip Codes Data Set examples uses a publicly
12 available data set of all zipcodes and populations in the United
13 States. These data are available at: zips.json.
14
16 Let's check if everything is installed.
17
18 Use the following command to load zips.json data set into mongod
19 instance:
20
21 $ mongoimport --drop -d test -c zipcodes zips.json
22
23 Let's use the MongoDB shell to verify that everything was imported suc‐
24 cessfully.
25
26 $ mongo test
27 connecting to: test
28 > db.zipcodes.count()
29 29467
30 > db.zipcodes.findOne()
31 {
32 "_id" : "35004",
33 "city" : "ACMAR",
34 "loc" : [
35 -86.51557,
36 33.584132
37 ],
38 "pop" : 6055,
39 "state" : "AL"
40 }
41
43 Each document in this collection has the following form:
44
45 {
46 "_id" : "35004",
47 "city" : "Acmar",
48 "state" : "AL",
49 "pop" : 6055,
50 "loc" : [-86.51557, 33.584132]
51 }
52
53 In these documents:
54
55 · The _id field holds the zipcode as a string.
56
57 · The city field holds the city name.
58
59 · The state field holds the two letter state abbreviation.
60
61 · The pop field holds the population.
62
63 · The loc field holds the location as a [latitude, longitude] array.
64
66 To get all states with a population greater than 10 million, use the
67 following aggregation pipeline: aggregation1.c.INDENT 0.0
68
69 #include <mongoc/mongoc.h>
70 #include <stdio.h>
71
72 static void
73 print_pipeline (mongoc_collection_t *collection)
74 {
75 mongoc_cursor_t *cursor;
76 bson_error_t error;
77 const bson_t *doc;
78 bson_t *pipeline;
79 char *str;
80
81 pipeline = BCON_NEW ("pipeline",
82 "[",
83 "{",
84 "$group",
85 "{",
86 "_id",
87 "$state",
88 "total_pop",
89 "{",
90 "$sum",
91 "$pop",
92 "}",
93 "}",
94 "}",
95 "{",
96 "$match",
97 "{",
98 "total_pop",
99 "{",
100 "$gte",
101 BCON_INT32 (10000000),
102 "}",
103 "}",
104 "}",
105 "]");
106
107 cursor = mongoc_collection_aggregate (
108 collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL);
109
110 while (mongoc_cursor_next (cursor, &doc)) {
111 str = bson_as_canonical_extended_json (doc, NULL);
112 printf ("%s\n", str);
113 bson_free (str);
114 }
115
116 if (mongoc_cursor_error (cursor, &error)) {
117 fprintf (stderr, "Cursor Failure: %s\n", error.message);
118 }
119
120 mongoc_cursor_destroy (cursor);
121 bson_destroy (pipeline);
122 }
123
124 int
125 main (int argc, char *argv[])
126 {
127 mongoc_client_t *client;
128 mongoc_collection_t *collection;
129 const char *uri_string =
130 "mongodb://localhost:27017/?appname=aggregation-example";
131 mongoc_uri_t *uri;
132 bson_error_t error;
133
134 mongoc_init ();
135
136 uri = mongoc_uri_new_with_error (uri_string, &error);
137 if (!uri) {
138 fprintf (stderr,
139 "failed to parse URI: %s\n"
140 "error message: %s\n",
141 uri_string,
142 error.message);
143 return EXIT_FAILURE;
144 }
145
146 client = mongoc_client_new_from_uri (uri);
147 if (!client) {
148 return EXIT_FAILURE;
149 }
150
151 mongoc_client_set_error_api (client, 2);
152 collection = mongoc_client_get_collection (client, "test", "zipcodes");
153
154 print_pipeline (collection);
155
156 mongoc_uri_destroy (uri);
157 mongoc_collection_destroy (collection);
158 mongoc_client_destroy (client);
159
160 mongoc_cleanup ();
161
162 return EXIT_SUCCESS;
163 }
164
165
166You should see a result like the following:
167
168 { "_id" : "PA", "total_pop" : 11881643 }
169 { "_id" : "OH", "total_pop" : 10847115 }
170 { "_id" : "NY", "total_pop" : 17990455 }
171 { "_id" : "FL", "total_pop" : 12937284 }
172 { "_id" : "TX", "total_pop" : 16986510 }
173 { "_id" : "IL", "total_pop" : 11430472 }
174 { "_id" : "CA", "total_pop" : 29760021 }
175
176 The above aggregation pipeline is build from two pipeline operators:
177 $group and $match.
178
179 The $group pipeline operator requires _id field where we specify group‐
180 ing; remaining fields specify how to generate composite value and must
181 use one of the group aggregation functions: $addToSet, $first, $last,
182 $max, $min, $avg, $push, $sum. The $match pipeline operator syntax is
183 the same as the read operation query syntax.
184
185 The $group process reads all documents and for each state it creates a
186 separate document, for example:
187
188 { "_id" : "WA", "total_pop" : 4866692 }
189
190 The total_pop field uses the $sum aggregation function to sum the val‐
191 ues of all pop fields in the source documents.
192
193 Documents created by $group are piped to the $match pipeline operator.
194 It returns the documents with the value of total_pop field greater than
195 or equal to 10 million.
196
198 To get the first three states with the greatest average population per
199 city, use the following aggregation:
200
201 pipeline = BCON_NEW ("pipeline", "[",
202 "{", "$group", "{", "_id", "{", "state", "$state", "city", "$city", "}", "pop", "{", "$sum", "$pop", "}", "}", "}",
203 "{", "$group", "{", "_id", "$_id.state", "avg_city_pop", "{", "$avg", "$pop", "}", "}", "}",
204 "{", "$sort", "{", "avg_city_pop", BCON_INT32 (-1), "}", "}",
205 "{", "$limit", BCON_INT32 (3) "}",
206 "]");
207
208 This aggregate pipeline produces:
209
210 { "_id" : "DC", "avg_city_pop" : 303450.0 }
211 { "_id" : "FL", "avg_city_pop" : 27942.29805615551 }
212 { "_id" : "CA", "avg_city_pop" : 27735.341099720412 }
213
214 The above aggregation pipeline is build from three pipeline operators:
215 $group, $sort and $limit.
216
217 The first $group operator creates the following documents:
218
219 { "_id" : { "state" : "WY", "city" : "Smoot" }, "pop" : 414 }
220
221 Note, that the $group operator can't use nested documents except the
222 _id field.
223
224 The second $group uses these documents to create the following docu‐
225 ments:
226
227 { "_id" : "FL", "avg_city_pop" : 27942.29805615551 }
228
229 These documents are sorted by the avg_city_pop field in descending
230 order. Finally, the $limit pipeline operator returns the first 3 docu‐
231 ments from the sorted set.
232
234 MongoDB, Inc
235
237 2017-present, MongoDB, Inc
238
239
240
241
2421.16.2 Feb 25, 2020 MONGOC_AGGREGATE(3)