}
416
}
1 package com.tangzhe.mongodb.mongotemplate;
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;
20 import java.math.BigDecimal;
21 import java.time.Duration;
22 import java.time.Instant;
23 import java.util.*;
25 import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
27 public class ShopTest extends BaseTest {
29 @Autowired
30 private MongoTemplate mongoTemplate;
32 /**
33 * 一共获取了多少食堂劵
34 */
35 @Test
36 public void test01() {
37 Instant start = Instant.now();
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"));
47 Instant end = Instant.now();
48 System.out.println(Duration.between(start, end).toMillis());
49 }
51 /**
52 * 一共节约了多少钱
53 */
54 @Test
55 public void test02() {
56 Instant start = Instant.now();
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);
67 BigDecimal saveAmount = ((Decimal128)result.getMappedResults().get(0).get("saveAmount")).bigDecimalValue();
68 System.out.println(saveAmount);
70 Instant end = Instant.now();
71 System.out.println(Duration.between(start, end).toMillis());
72 }
74 /**
75 * 一共支付了多少钱
76 */
77 @Test
78 public void test03() {
79 Instant start = Instant.now();
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);
87 System.out.println(result.getMappedResults().get(0).get("total"));
89 Instant end = Instant.now();
90 System.out.println(Duration.between(start, end).toMillis());
91 }
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);
103 BigDecimal orgAmount = ((Decimal128) result.getMappedResults().get(0).get("total")).bigDecimalValue();
104 System.out.println(orgAmount);
105 }
107 /**
108 * 交易的产品比例(含产品类型和比例)
109 */
110 @Test
111 public void test05() {
112 Instant start = Instant.now();
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);
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 }
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);
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 }
147 Instant end = Instant.now();
148 System.out.println(Duration.between(start, end).toMillis());
149 }
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);
162 int count = (int) result.getMappedResults().get(0).get("count");
163 System.out.println(count);
164 }
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);
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 }
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 }
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 }
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);
235 List<MOrder> orders = new ArrayList<>(3);
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 }
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 }
270 /**
271 * 查询成为会员的时间和第几位会员
272 */
273 @Test
274 public void test12() {
275 Long userId = 1L;
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);
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 }
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 }
318 }