1 package com.tangzhe.mongodb.mongotemplate;
2
3 import com.mongodb.BasicDBObject;
4 import com.mongodb.DBObject;
5 import com.tangzhe.mongodb.BaseTest;
6 import com.tangzhe.mongodb.Student;
7 import com.tangzhe.shop.document.MBalanceIncrease;
8 import com.tangzhe.shop.document.MVip;
9 import com.tangzhe.shop.entity.AmountChart;
10 import com.tangzhe.shop.entity.VipChart;
11 import com.tangzhe.test.document.PlayareaStatistics;
12 import com.tangzhe.test.util.DateUtils;
13 import org.junit.Test;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.data.domain.Sort;
16 import org.springframework.data.mongodb.core.MongoTemplate;
17 import org.springframework.data.mongodb.core.aggregation.Aggregation;
18 import org.springframework.data.mongodb.core.aggregation.AggregationResults;
19 import org.springframework.data.mongodb.core.query.Criteria;
20 import org.springframework.data.mongodb.core.query.Query;
21
22 import java.math.BigDecimal;
23 import java.text.DecimalFormat;
24 import java.text.ParseException;
25 import java.text.SimpleDateFormat;
26 import java.time.Duration;
27 import java.time.Instant;
28 import java.util.*;
29
30 import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
31
32 public class MongoTemplateTest2 extends BaseTest {
33
34 @Autowired
35 private MongoTemplate mongoTemplate;
36
37 //@Test
38 public void test01() {
39 // List<PlayareaStatistics> list = mongoTemplate.find(
40 // Query.query(
41 // new Criteria().andOperator(
42 // Criteria.where("areaId").is(21),
43 // Criteria.where("type").is("READ")
44 // )
45 // ),
46 // PlayareaStatistics.class);
47 // System.out.println(list);
48
49 // GroupByResults<PlayareaStatistics> group = mongoTemplate.group(
50 // Criteria.where("areaId").is(21),
51 // "playarea_statistics",
52 // new GroupBy("type"),
53 // PlayareaStatistics.class);
54 // System.out.println(group);
55
56 Aggregation aggregation = Aggregation.newAggregation(
57 match(Criteria.where("areaId").is(21)),
58 group("type").count().as("sum"));
59 AggregationResults<BasicDBObject> outputTypeCount =
60 mongoTemplate.aggregate(aggregation, PlayareaStatistics.class, BasicDBObject.class);
61
62 for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
63 DBObject obj = iterator.next();
64 System.out.println(obj);
65 }
66 }
67
68 //@Test
69 public void test02() {
70 Aggregation aggregation = Aggregation.newAggregation(
71 match(
72 Criteria.where("areaId").is(21)
73 .andOperator(Criteria.where("type").is("READ"))),
74 group("city").count().as("sum"));
75 AggregationResults<BasicDBObject> outputTypeCount =
76 mongoTemplate.aggregate(aggregation, PlayareaStatistics.class, BasicDBObject.class);
77
78 for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
79 DBObject obj = iterator.next();
80 System.out.println(obj);
81 }
82 }
83
84 //@Test
85 public void test03() throws ParseException {
86 // 默认查当月第一天至当天之间的数据
87 //Date date = new Date();
88 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
89 Date date = sdf.parse("2018-05-02 00:00:00");
90 String beginTime = DateUtils.getMonthFirstDay(date);
91 String endTime = DateUtils.getMonthLastDay(date);
92 Date beginDate = sdf.parse(beginTime);
93 Date endDate = sdf.parse(endTime);
94
95 Aggregation aggregation = Aggregation.newAggregation(
96 match(
97 Criteria.where("areaId").is(21L)
98 .andOperator(
99 Criteria.where("operateTime").gte(beginDate).lt(endDate),
100 Criteria.where("type").is("READ"))),
101 group("logDate").count().as("sum"));
102 AggregationResults<BasicDBObject> outputTypeCount =
103 mongoTemplate.aggregate(aggregation, PlayareaStatistics.class, BasicDBObject.class);
104
105 Map<String, Integer> map = new HashMap<>();
106 for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
107 DBObject obj = iterator.next();
108 String day = ((String) obj.get("_id")).substring(8, 10); // day
109 map.put(day, (Integer) obj.get("sum"));
110 }
111
112 System.out.println(map);
113 }
114
115 //@Test
116 public void test04() throws ParseException {
117 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
118 Date date = sdf.parse("2018-05-02 00:00:00");
119 String beginTime = DateUtils.getMonthFirstDay(date);
120 String endTime = DateUtils.getMonthLastDay(date);
121 Date beginDate = sdf.parse(beginTime);
122 Date endDate = sdf.parse(endTime);
123 }
124
125 @Test
126 public void test05() throws ParseException {
127 Date date = new Date();
128 String today = DateUtils.formatToString(date, "yyyy-MM-dd");
129 String thisMonth = DateUtils.formatToString(date, "yyyy-MM");
130 List<MVip> list = mongoTemplate.find(
131 Query.query(
132 Criteria.where("day").is("2018-03-28")
133 ), MVip.class);
134 System.out.println(list.size());
135 }
136
137 @Test
138 public void test06() {
139 Date date = new Date();
140 String today = DateUtils.formatToString(date, "yyyy-MM-dd");
141 String thisMonth = DateUtils.formatToString(date, "yyyy-MM");
142 Double sum = 0.0;
143 List<MBalanceIncrease> list = mongoTemplate.find(
144 Query.query(
145 Criteria.where("day").is("2018-03-28")
146 ), MBalanceIncrease.class);
147 for (MBalanceIncrease balance : list) {
148 sum = new BigDecimal(sum).add(new BigDecimal(balance.getAmount().toString())).doubleValue();
149 }
150
151 DecimalFormat decimalFormat = new DecimalFormat("#.00");
152 sum = Double.valueOf(decimalFormat.format(sum));
153 System.out.println(sum);
154 }
155
156 @Test
157 public void test07() {
158 Date date = new Date();
159 String today = DateUtils.formatToString(date, "yyyy-MM-dd");
160 String thisMonth = DateUtils.formatToString(date, "yyyy-MM");
161 Double sum = 0.0;
162 Aggregation aggregation = Aggregation.newAggregation(
163 match(
164 Criteria.where("day").in(DateUtils.getPast7Date())),
165 group("day")
166 .sum("amount").as("total")
167 //.push("createDate").as("date")
168 .first("day").as("day"),
169 project("total", "day"),
170 sort(Sort.Direction.DESC, "day"));
171 AggregationResults<BasicDBObject> outputTypeCount =
172 mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
173
174 for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
175 DBObject obj = iterator.next();
176 System.out.println(obj);
177 }
178 }
179
180 @Test
181 public void test08() {
182 Aggregation aggregation = Aggregation.newAggregation(
183 match(Criteria.where("day").is("2018-08-16")),
184 group("day").sum("amount").as("total"));
185 AggregationResults<BasicDBObject> result =
186 mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
187
188 System.out.println(result.getMappedResults().get(0).get("total"));
189 }
190
191 @Test
192 public void test09() {
193 List<String> past7Date = DateUtils.getPast7Date();
194 Aggregation aggregation = Aggregation.newAggregation(
195 match(
196 Criteria.where("day").in(past7Date)),
197 group("day")
198 .sum("amount").as("total")
199 .first("day").as("day"),
200 project("total", "day"),
201 sort(Sort.Direction.DESC, "day"));
202 AggregationResults<BasicDBObject> result =
203 mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
204
205 List<AmountChart> sevenDays = new ArrayList<>();
206 Map<String, Double> map = new HashMap<>();
207 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
208 DBObject obj = iterator.next();
209 map.put(obj.get("day").toString(), Double.valueOf(obj.get("total").toString()));
210 }
211
212 for (String day : past7Date) {
213 if (map.containsKey(day)) {
214 sevenDays.add(new AmountChart(day, map.get(day)));
215 } else {
216 sevenDays.add(new AmountChart(day, 0.0));
217 }
218 }
219
220 System.out.println(sevenDays);
221 AmountChart amountChart = sevenDays.get(0);
222 System.out.println(amountChart);
223 }
224
225 @Test
226 public void test10() {
227 List<String> past6Months = DateUtils.getPast6Months();
228 Aggregation aggregation = Aggregation.newAggregation(
229 match(
230 Criteria.where("month").in(past6Months)),
231 group("month")
232 .sum("amount").as("total")
233 .first("month").as("month"),
234 project("total", "month"),
235 sort(Sort.Direction.DESC, "month"));
236 AggregationResults<BasicDBObject> result =
237 mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
238
239 List<AmountChart> sixMonths = new ArrayList<>();
240 Map<String, Double> map = new HashMap<>();
241 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
242 DBObject obj = iterator.next();
243 map.put(obj.get("month").toString(), Double.valueOf(obj.get("total").toString()));
244 }
245
246 for (String month : past6Months) {
247 if (map.containsKey(month)) {
248 sixMonths.add(new AmountChart(month, map.get(month)));
249 } else {
250 sixMonths.add(new AmountChart(month, 0.0));
251 }
252 }
253
254 System.out.println(sixMonths);
255 AmountChart monthAmount = sixMonths.get(0);
256 System.out.println(monthAmount);
257 }
258
259 @Test
260 public void test11() {
261 Aggregation aggregation = Aggregation.newAggregation(
262 match(
263 Criteria.where("province").is("江苏")),
264 group("province").sum("amount").as("total"));
265 AggregationResults<BasicDBObject> result =
266 mongoTemplate.aggregate(aggregation, com.tangzhe.shop.service.MOrder.class, BasicDBObject.class);
267
268 System.out.println(result.getMappedResults().get(0).get("total"));
269 }
270
271 @Test
272 public void test12() {
273 // 查询当日 老方法
274 List<MVip> list = mongoTemplate.find(
275 Query.query(
276 Criteria.where("province").is("江苏").and("day").is("2018-08-16")
277 ), MVip.class);
278 System.out.println(list.size());
279
280 // 查询当日 新方法
281 Aggregation aggregation = Aggregation.newAggregation(
282 match(
283 Criteria.where("province").is("江苏").and("day").is("2018-08-16")),
284 group("province").count().as("total"));
285 AggregationResults<BasicDBObject> result =
286 mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
287
288 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
289 DBObject obj = iterator.next();
290 System.out.println(obj);
291 }
292 System.out.println(result.getMappedResults().get(0).get("total"));
293 }
294
295 @Test
296 public void test13() {
297 // 查询近7日 老方法
298 List<VipChart> sevenDays = new ArrayList<>();
299 List<String> past6Date = DateUtils.getPast7Date();
300 for (String day : past6Date) {
301 int dc = mongoTemplate.find(
302 Query.query(
303 Criteria.where("province").is("江苏").and("day").is(day)
304 ), MVip.class).size();
305 VipChart vipChart = new VipChart(day, dc);
306 sevenDays.add(vipChart);
307 }
308 sevenDays.forEach(System.out::println);
309
310 // 查询近7日 新方法
311 List<String> past7Date = DateUtils.getPast7Date();
312 Aggregation aggregation = Aggregation.newAggregation(
313 match(
314 Criteria.where("province").is("江苏").and("day").in(past7Date)),
315 group("day")
316 .count().as("total")
317 .first("day").as("day"),
318 project("total", "day"),
319 sort(Sort.Direction.DESC, "day"));
320 AggregationResults<BasicDBObject> result =
321 mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
322
323 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
324 DBObject obj = iterator.next();
325 System.out.println(obj);
326 }
327 }
328
329 @Test
330 public void test14() {
331 // 查询累计 老方法
332 int total = mongoTemplate.find(
333 Query.query(
334 Criteria.where("city").is("苏州")
335 ), MVip.class).size();
336 System.out.println(total);
337
338 // 查询累计 新方法
339 Aggregation aggregation = Aggregation.newAggregation(
340 match(
341 Criteria.where("city").is("苏州")),
342 group("province").count().as("total"));
343 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
344 total = Integer.valueOf(result.getMappedResults().get(0).get("total").toString());
345 System.out.println(total);
346 }
347
348 @Test
349 public void test15() {
350 Map<String, Integer> map = new HashMap<>();
351 Aggregation aggregation = Aggregation.newAggregation(
352 match(
353 Criteria.where("province").is("江苏")),
354 group("city").count().as("total"));
355 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
356 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
357 DBObject obj = iterator.next();
358 System.out.println(obj);
359 map.put(obj.get("_id").toString(), Integer.valueOf(obj.get("total").toString()));
360 }
361 System.out.println();
362 }
363
364 /**
365 * 关联查询
366 */
367 @Test
368 public void test16() {
369 Instant start = Instant.now();
370 Aggregation aggregation = Aggregation.newAggregation(
371 match(
372 Criteria.where("id").is("5b7a5fa1d0c5852d745c4e81")),
373 lookup("class_info", "classId", "_id", "class_info")
374 );
375 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, Student.class, BasicDBObject.class);
376 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
377 DBObject obj = iterator.next();
378 System.out.println(obj);
379 }
380 Instant end = Instant.now();
381 System.out.println(Duration.between(start, end).toMillis());
382 }
383
384 @Test
385 public void test17() {
386 Aggregation aggregation = Aggregation.newAggregation(
387 match(Criteria.where("province").is("江苏")),
388 group("userId").count().as("total").push("city").as("city"),
389 match(Criteria.where("total").gte(2)),
390 project("total", "city"));
391 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MCustomerSave.class, BasicDBObject.class);
392 int total = result.getMappedResults().size();
393 System.out.println(total);
394 }
395
396 @Test
397 public void test18() {
398 Map<String, Integer> map = new HashMap<>();
399 Aggregation aggregation = Aggregation.newAggregation(
400 match(Criteria.where("province").is("江苏")),
401 group("city").count().as("total"));
402 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MCustomerSave.class, BasicDBObject.class);
403 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
404 DBObject obj = iterator.next();
405 String city = obj.get("_id").toString();
406 aggregation = Aggregation.newAggregation(
407 match(Criteria.where("city").is(city)),
408 group("userId").count().as("total"),
409 match(Criteria.where("total").gte(2)));
410 AggregationResults<BasicDBObject> res = mongoTemplate.aggregate(aggregation, MCustomerSave.class, BasicDBObject.class);
411 map.put(city, res.getMappedResults().size());
412 }
413 System.out.println();
414 }
415
416 }
1 package com.tangzhe.mongodb.mongotemplate;
2
3 import com.mongodb.BasicDBObject;
4 import com.mongodb.DBObject;
5 import com.tangzhe.mongodb.BaseTest;
6 import com.tangzhe.shop.document.MOrder;
7 import com.tangzhe.shop.document.MUser;
8 import com.tangzhe.shop.document.MVipRecord;
9 import com.tangzhe.shop.service.Product;
10 import com.tangzhe.test.util.DateUtils;
11 import org.bson.types.Decimal128;
12 import org.junit.Test;
13 import org.springframework.beans.factory.annotation.Autowired;
14 import org.springframework.data.domain.Sort;
15 import org.springframework.data.mongodb.core.MongoTemplate;
16 import org.springframework.data.mongodb.core.aggregation.Aggregation;
17 import org.springframework.data.mongodb.core.aggregation.AggregationResults;
18 import org.springframework.data.mongodb.core.query.Criteria;
19
20 import java.math.BigDecimal;
21 import java.time.Duration;
22 import java.time.Instant;
23 import java.util.*;
24
25 import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
26
27 public class ShopTest extends BaseTest {
28
29 @Autowired
30 private MongoTemplate mongoTemplate;
31
32 /**
33 * 一共获取了多少食堂劵
34 */
35 @Test
36 public void test01() {
37 Instant start = Instant.now();
38
39 Aggregation aggregation = Aggregation.newAggregation(
40 match(Criteria.where("userId").is(8744L)),
41 unwind("productList"),
42 group("userId").sum("productList.ticket").as("total"));
43 AggregationResults<BasicDBObject> result =
44 mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
45 System.out.println(result.getMappedResults().get(0).get("total"));
46
47 Instant end = Instant.now();
48 System.out.println(Duration.between(start, end).toMillis());
49 }
50
51 /**
52 * 一共节约了多少钱
53 */
54 @Test
55 public void test02() {
56 Instant start = Instant.now();
57
58 Aggregation aggregation = Aggregation.newAggregation(
59 match(Criteria.where("userId").is(8744L)),
60 group("userId")
61 .sum("orgAmount").as("orgAmount")
62 .sum("payAmount").as("payAmount"),
63 project("orgAmount", "payAmount")
64 .and("orgAmount").minus("payAmount").as("saveAmount"));
65 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
66
67 BigDecimal saveAmount = ((Decimal128)result.getMappedResults().get(0).get("saveAmount")).bigDecimalValue();
68 System.out.println(saveAmount);
69
70 Instant end = Instant.now();
71 System.out.println(Duration.between(start, end).toMillis());
72 }
73
74 /**
75 * 一共支付了多少钱
76 */
77 @Test
78 public void test03() {
79 Instant start = Instant.now();
80
81 Aggregation aggregation = Aggregation.newAggregation(
82 match(Criteria.where("userId").is(8744L)),
83 group("userId").sum("payAmount").as("total"));
84 AggregationResults<BasicDBObject> result =
85 mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
86
87 System.out.println(result.getMappedResults().get(0).get("total"));
88
89 Instant end = Instant.now();
90 System.out.println(Duration.between(start, end).toMillis());
91 }
92
93 /**
94 * 下单总共原始价多少钱
95 */
96 @Test
97 public void test04() {
98 Aggregation aggregation = Aggregation.newAggregation(
99 match(Criteria.where("userId").is(8744L)),
100 group("userId").sum("orgAmount").as("total"));
101 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
102
103 BigDecimal orgAmount = ((Decimal128) result.getMappedResults().get(0).get("total")).bigDecimalValue();
104 System.out.println(orgAmount);
105 }
106
107 /**
108 * 交易的产品比例(含产品类型和比例)
109 */
110 @Test
111 public void test05() {
112 Instant start = Instant.now();
113
114 Aggregation aggregation = Aggregation.newAggregation(
115 match(Criteria.where("userId").is(8744L)),
116 project("productList"));
117 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
118
119 int sum = 0;
120 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
121 DBObject obj = iterator.next();
122 List<Product> products = (List<Product>) obj.get("productList");
123 sum += products.size();
124 }
125
126 aggregation = Aggregation.newAggregation(
127 match(Criteria.where("userId").is(8744L)),
128 unwind("productList"),
129 group("productList.productType").count().as("total"));
130 result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
131
132 Map<String, BigDecimal> rateMap = new HashMap<>();
133 int i = 0;
134 BigDecimal other = new BigDecimal(0);
135 for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
136 DBObject obj = iterator.next();
137 if (i == 6) {
138 rateMap.put((String)obj.get("_id"), new BigDecimal(1).subtract(other));
139 break;
140 }
141 BigDecimal rate = new BigDecimal((int)obj.get("total")).divide(new BigDecimal(sum));
142 rateMap.put((String)obj.get("_id"), rate);
143 other = other.add(rate);
144 i ++;
145 }
146
147 Instant end = Instant.now();
148 System.out.println(Duration.between(start, end).toMillis());
149 }
150
151 /**
152 * 一共下了多少单
153 */
154 @Test
155 public void test06() {
156 Aggregation aggregation = Aggregation.newAggregation(
157 match(Criteria.where("userId").is(8744L)),
158 group("userId").count().as("count"));
159 AggregationResults<BasicDBObject> result =
160 mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
161
162 int count = (int) result.getMappedResults().get(0).get("count");
163 System.out.println(count);
164 }
165
166 /**
167 * 最喜欢的店铺(即下单最多的店铺)
168 */
169 @Test
170 public void test07() {
171 Aggregation aggregation = Aggregation.newAggregation(
172 match(Criteria.where("userId").is(8744L)),
173 group("shopId").count().as("count"),
174 sort(Sort.Direction.DESC, "count"),
175 limit(1));
176 AggregationResults<BasicDBObject> result =
177 mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
178
179 long shopId = (long) result.getMappedResults().get(0).get("_id");
180 int count = (int) result.getMappedResults().get(0).get("count");
181 System.out.println(shopId);
182 System.out.println(count);
183 }
184
185 /**
186 * 下单最多的那天和下单数量
187 */
188 @Test
189 public void test08() {
190 Aggregation aggregation = Aggregation.newAggregation(
191 match(Criteria.where("userId").is(8744L)),
192 project().andExpression("{$dateToString:{format:'%Y-%m-%d',date: '$createTime'}}").as("createTime"),
193 group("createTime").count().as("count"),
194 sort(Sort.Direction.DESC, "count"),
195 limit(1));
196 AggregationResults<BasicDBObject> result =
197 mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
198 String day = (String) result.getMappedResults().get(0).get("_id");
199 int count = (int) result.getMappedResults().get(0).get("count");
200 System.out.println(day);
201 System.out.println(count);
202 }
203
204 /**
205 * 花费金额最多的那天和金额
206 */
207 @Test
208 public void test09() {
209 Aggregation aggregation = Aggregation.newAggregation(
210 match(Criteria.where("userId").is(8744L)
211 .and("createTime").gte(DateUtils.fromString("2018-01-01 16:00:57", "yyyy-MM-dd HH:mm:ss")).lte(new Date())),
212 project("payAmount").andExpression("{$dateToString:{format:'%Y-%m-%d',date: '$createTime'}}").as("createTime"),
213 group("createTime").sum("payAmount").as("total"),
214 sort(Sort.Direction.DESC, "total"),
215 limit(1));
216 AggregationResults<BasicDBObject> result =
217 mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
218 String day = (String) result.getMappedResults().get(0).get("_id");
219 BigDecimal amount = ((Decimal128)result.getMappedResults().get(0).get("total")).bigDecimalValue();
220 System.out.println(day);
221 System.out.println(amount);
222 }
223
224 /**
225 * 前3笔最多消费
226 */
227 @Test
228 public void test10() {
229 Aggregation aggregation = Aggregation.newAggregation(
230 match(Criteria.where("userId").is(8744L)),
231 sort(Sort.Direction.DESC, "payAmount"),
232 limit(3));
233 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
234
235 List<MOrder> orders = new ArrayList<>(3);
236
237 for (BasicDBObject bd : result.getMappedResults()) {
238 MOrder order = new MOrder();
239 order.setOrderId(bd.getString("orderId"));
240 order.setPayAmount((Decimal128) bd.get("payAmount"));
241 order.setShopId(bd.getLong("shopId"));
242 order.setCreateTime(bd.getDate("createTime"));
243 orders.add(order);
244 }
245 System.out.println(orders);
246 }
247
248 /**
249 * 第一笔交易信息
250 */
251 @Test
252 public void test11() {
253 Aggregation aggregation = Aggregation.newAggregation(
254 match(Criteria.where("userId").is(8744L)),
255 sort(Sort.Direction.ASC, "createTime"),
256 limit(1));
257 AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
258 BasicDBObject bd = result.getMappedResults().get(0);
259 MOrder order = new MOrder();
260 order.setOrderId(bd.getString("orderId"));
261 order.setPayAmount((Decimal128) bd.get("payAmount"));
262 order.setShopId(bd.getLong("shopId"));
263 order.setCreateTime(bd.getDate("createTime"));
264 System.out.println("第一笔交易时间为 " + DateUtils.formatToString(order.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
265 System.out.println("第一笔交易金额为 " + order.getPayAmount().bigDecimalValue().setScale(2, BigDecimal.ROUND_HALF_DOWN));
266 System.out.println("第一笔交易商家id为 " + order.getShopId());
267 System.out.println("第一笔交易订单号为 " + order.getOrderId());
268 }
269
270 /**
271 * 查询成为会员的时间和第几位会员
272 */
273 @Test
274 public void test12() {
275 Long userId = 1L;
276
277 Aggregation agg = Aggregation.newAggregation(
278 match(
279 Criteria.where("userId").is(userId)
280 .and("afterUserType").is("FORMAL_VIP")),
281 sort(Sort.Direction.ASC, "startTime"),
282 limit(1));
283 AggregationResults<BasicDBObject> result1 = mongoTemplate.aggregate(agg, MVipRecord.class, BasicDBObject.class);
284
285 agg = Aggregation.newAggregation(
286 match(
287 Criteria.where("startTime")
288 .lt(result1.getMappedResults().get(0).getDate("startTime"))));
289 AggregationResults<BasicDBObject> result2 = mongoTemplate.aggregate(agg, MVipRecord.class, BasicDBObject.class);
290 int count = result2.getMappedResults().size() + 1;
291 System.out.println("您成为会员的时间:" + DateUtils.formatToString(result1.getMappedResults().get(0).getDate("startTime"), "yyyy-MM-dd hh:mm:ss"));
292 System.out.println("您是第" + count + "位会员");
293 }
294
295 /**
296 * 查询注册时间和是第几位用户
297 */
298 @Test
299 public void test13() {
300 Instant start = Instant.now();
301 Long userId = 1L;
302 Aggregation agg = Aggregation.newAggregation(
303 match(Criteria.where("userId").is(userId)));
304 AggregationResults<BasicDBObject> result1 = mongoTemplate.aggregate(agg, MUser.class, BasicDBObject.class);
305 agg = Aggregation.newAggregation(
306 match(
307 Criteria.where("createTime")
308 .lt(result1.getMappedResults().get(0).getDate("createTime"))),
309 project("userId"));
310 AggregationResults<BasicDBObject> result2 = mongoTemplate.aggregate(agg, MUser.class, BasicDBObject.class);
311 int count = result2.getMappedResults().size() + 1;
312 System.out.println("您成为用户的时间:" + DateUtils.formatToString(result1.getMappedResults().get(0).getDate("createTime"), "yyyy-MM-dd hh:mm:ss"));
313 System.out.println("您是第" + count + "位注册用户");
314 Instant end = Instant.now();
315 System.out.println(Duration.between(start, end).toMillis());
316 }
317
318 }