package com.tangzhe.mongodb.mongotemplate;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.tangzhe.mongodb.BaseTest;
import com.tangzhe.mongodb.Student;
import com.tangzhe.shop.document.MBalanceIncrease;
import com.tangzhe.shop.document.MVip;
import com.tangzhe.shop.entity.AmountChart;
import com.tangzhe.shop.entity.VipChart;
import com.tangzhe.test.document.PlayareaStatistics;
import com.tangzhe.test.util.DateUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
public class MongoTemplateTest2 extends BaseTest {
@Autowired
private MongoTemplate mongoTemplate;
public void test01() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("areaId").is(21)),
group("type").count().as("sum"));
AggregationResults<BasicDBObject> outputTypeCount =
mongoTemplate.aggregate(aggregation, PlayareaStatistics.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
}
}
public void test02() {
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("areaId").is(21)
.andOperator(Criteria.where("type").is("READ"))),
group("city").count().as("sum"));
AggregationResults<BasicDBObject> outputTypeCount =
mongoTemplate.aggregate(aggregation, PlayareaStatistics.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
}
}
public void test03() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2018-05-02 00:00:00");
String beginTime = DateUtils.getMonthFirstDay(date);
String endTime = DateUtils.getMonthLastDay(date);
Date beginDate = sdf.parse(beginTime);
Date endDate = sdf.parse(endTime);
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("areaId").is(21L)
.andOperator(
Criteria.where("operateTime").gte(beginDate).lt(endDate),
Criteria.where("type").is("READ"))),
group("logDate").count().as("sum"));
AggregationResults<BasicDBObject> outputTypeCount =
mongoTemplate.aggregate(aggregation, PlayareaStatistics.class, BasicDBObject.class);
Map<String, Integer> map = new HashMap<>();
for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
String day = ((String) obj.get("_id")).substring(8, 10);
map.put(day, (Integer) obj.get("sum"));
}
System.out.println(map);
}
public void test04() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2018-05-02 00:00:00");
String beginTime = DateUtils.getMonthFirstDay(date);
String endTime = DateUtils.getMonthLastDay(date);
Date beginDate = sdf.parse(beginTime);
Date endDate = sdf.parse(endTime);
}
@Test
public void test05() throws ParseException {
Date date = new Date();
String today = DateUtils.formatToString(date, "yyyy-MM-dd");
String thisMonth = DateUtils.formatToString(date, "yyyy-MM");
List<MVip> list = mongoTemplate.find(
Query.query(
Criteria.where("day").is("2018-03-28")
), MVip.class);
System.out.println(list.size());
}
@Test
public void test06() {
Date date = new Date();
String today = DateUtils.formatToString(date, "yyyy-MM-dd");
String thisMonth = DateUtils.formatToString(date, "yyyy-MM");
Double sum = 0.0;
List<MBalanceIncrease> list = mongoTemplate.find(
Query.query(
Criteria.where("day").is("2018-03-28")
), MBalanceIncrease.class);
for (MBalanceIncrease balance : list) {
sum = new BigDecimal(sum).add(new BigDecimal(balance.getAmount().toString())).doubleValue();
}
DecimalFormat decimalFormat = new DecimalFormat("#.00");
sum = Double.valueOf(decimalFormat.format(sum));
System.out.println(sum);
}
@Test
public void test07() {
Date date = new Date();
String today = DateUtils.formatToString(date, "yyyy-MM-dd");
String thisMonth = DateUtils.formatToString(date, "yyyy-MM");
Double sum = 0.0;
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("day").in(DateUtils.getPast7Date())),
group("day")
.sum("amount").as("total")
.first("day").as("day"),
project("total", "day"),
sort(Sort.Direction.DESC, "day"));
AggregationResults<BasicDBObject> outputTypeCount =
mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = outputTypeCount.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
}
}
@Test
public void test08() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("day").is("2018-08-16")),
group("day").sum("amount").as("total"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
System.out.println(result.getMappedResults().get(0).get("total"));
}
@Test
public void test09() {
List<String> past7Date = DateUtils.getPast7Date();
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("day").in(past7Date)),
group("day")
.sum("amount").as("total")
.first("day").as("day"),
project("total", "day"),
sort(Sort.Direction.DESC, "day"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
List<AmountChart> sevenDays = new ArrayList<>();
Map<String, Double> map = new HashMap<>();
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
map.put(obj.get("day").toString(), Double.valueOf(obj.get("total").toString()));
}
for (String day : past7Date) {
if (map.containsKey(day)) {
sevenDays.add(new AmountChart(day, map.get(day)));
} else {
sevenDays.add(new AmountChart(day, 0.0));
}
}
System.out.println(sevenDays);
AmountChart amountChart = sevenDays.get(0);
System.out.println(amountChart);
}
@Test
public void test10() {
List<String> past6Months = DateUtils.getPast6Months();
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("month").in(past6Months)),
group("month")
.sum("amount").as("total")
.first("month").as("month"),
project("total", "month"),
sort(Sort.Direction.DESC, "month"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MBalanceIncrease.class, BasicDBObject.class);
List<AmountChart> sixMonths = new ArrayList<>();
Map<String, Double> map = new HashMap<>();
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
map.put(obj.get("month").toString(), Double.valueOf(obj.get("total").toString()));
}
for (String month : past6Months) {
if (map.containsKey(month)) {
sixMonths.add(new AmountChart(month, map.get(month)));
} else {
sixMonths.add(new AmountChart(month, 0.0));
}
}
System.out.println(sixMonths);
AmountChart monthAmount = sixMonths.get(0);
System.out.println(monthAmount);
}
@Test
public void test11() {
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("province").is("江苏")),
group("province").sum("amount").as("total"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, com.tangzhe.shop.service.MOrder.class, BasicDBObject.class);
System.out.println(result.getMappedResults().get(0).get("total"));
}
@Test
public void test12() {
List<MVip> list = mongoTemplate.find(
Query.query(
Criteria.where("province").is("江苏").and("day").is("2018-08-16")
), MVip.class);
System.out.println(list.size());
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("province").is("江苏").and("day").is("2018-08-16")),
group("province").count().as("total"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
}
System.out.println(result.getMappedResults().get(0).get("total"));
}
@Test
public void test13() {
List<VipChart> sevenDays = new ArrayList<>();
List<String> past6Date = DateUtils.getPast7Date();
for (String day : past6Date) {
int dc = mongoTemplate.find(
Query.query(
Criteria.where("province").is("江苏").and("day").is(day)
), MVip.class).size();
VipChart vipChart = new VipChart(day, dc);
sevenDays.add(vipChart);
}
sevenDays.forEach(System.out::println);
List<String> past7Date = DateUtils.getPast7Date();
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("province").is("江苏").and("day").in(past7Date)),
group("day")
.count().as("total")
.first("day").as("day"),
project("total", "day"),
sort(Sort.Direction.DESC, "day"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
}
}
@Test
public void test14() {
int total = mongoTemplate.find(
Query.query(
Criteria.where("city").is("苏州")
), MVip.class).size();
System.out.println(total);
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("city").is("苏州")),
group("province").count().as("total"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
total = Integer.valueOf(result.getMappedResults().get(0).get("total").toString());
System.out.println(total);
}
@Test
public void test15() {
Map<String, Integer> map = new HashMap<>();
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("province").is("江苏")),
group("city").count().as("total"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MVip.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
map.put(obj.get("_id").toString(), Integer.valueOf(obj.get("total").toString()));
}
System.out.println();
}
@Test
public void test16() {
Instant start = Instant.now();
Aggregation aggregation = Aggregation.newAggregation(
match(
Criteria.where("id").is("5b7a5fa1d0c5852d745c4e81")),
lookup("class_info", "classId", "_id", "class_info")
);
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, Student.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
System.out.println(obj);
}
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
@Test
public void test17() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("province").is("江苏")),
group("userId").count().as("total").push("city").as("city"),
match(Criteria.where("total").gte(2)),
project("total", "city"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MCustomerSave.class, BasicDBObject.class);
int total = result.getMappedResults().size();
System.out.println(total);
}
@Test
public void test18() {
Map<String, Integer> map = new HashMap<>();
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("province").is("江苏")),
group("city").count().as("total"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MCustomerSave.class, BasicDBObject.class);
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
String city = obj.get("_id").toString();
aggregation = Aggregation.newAggregation(
match(Criteria.where("city").is(city)),
group("userId").count().as("total"),
match(Criteria.where("total").gte(2)));
AggregationResults<BasicDBObject> res = mongoTemplate.aggregate(aggregation, MCustomerSave.class, BasicDBObject.class);
map.put(city, res.getMappedResults().size());
}
System.out.println();
}
}
package com.tangzhe.mongodb.mongotemplate;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.tangzhe.mongodb.BaseTest;
import com.tangzhe.shop.document.MOrder;
import com.tangzhe.shop.document.MUser;
import com.tangzhe.shop.document.MVipRecord;
import com.tangzhe.shop.service.Product;
import com.tangzhe.test.util.DateUtils;
import org.bson.types.Decimal128;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
public class ShopTest extends BaseTest {
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void test01() {
Instant start = Instant.now();
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
unwind("productList"),
group("userId").sum("productList.ticket").as("total"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
System.out.println(result.getMappedResults().get(0).get("total"));
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
@Test
public void test02() {
Instant start = Instant.now();
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
group("userId")
.sum("orgAmount").as("orgAmount")
.sum("payAmount").as("payAmount"),
project("orgAmount", "payAmount")
.and("orgAmount").minus("payAmount").as("saveAmount"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
BigDecimal saveAmount = ((Decimal128)result.getMappedResults().get(0).get("saveAmount")).bigDecimalValue();
System.out.println(saveAmount);
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
@Test
public void test03() {
Instant start = Instant.now();
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
group("userId").sum("payAmount").as("total"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
System.out.println(result.getMappedResults().get(0).get("total"));
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
@Test
public void test04() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
group("userId").sum("orgAmount").as("total"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
BigDecimal orgAmount = ((Decimal128) result.getMappedResults().get(0).get("total")).bigDecimalValue();
System.out.println(orgAmount);
}
@Test
public void test05() {
Instant start = Instant.now();
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
project("productList"));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
int sum = 0;
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
List<Product> products = (List<Product>) obj.get("productList");
sum += products.size();
}
aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
unwind("productList"),
group("productList.productType").count().as("total"));
result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
Map<String, BigDecimal> rateMap = new HashMap<>();
int i = 0;
BigDecimal other = new BigDecimal(0);
for (Iterator<BasicDBObject> iterator = result.iterator(); iterator.hasNext(); ) {
DBObject obj = iterator.next();
if (i == 6) {
rateMap.put((String)obj.get("_id"), new BigDecimal(1).subtract(other));
break;
}
BigDecimal rate = new BigDecimal((int)obj.get("total")).divide(new BigDecimal(sum));
rateMap.put((String)obj.get("_id"), rate);
other = other.add(rate);
i ++;
}
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
@Test
public void test06() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
group("userId").count().as("count"));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
int count = (int) result.getMappedResults().get(0).get("count");
System.out.println(count);
}
@Test
public void test07() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
group("shopId").count().as("count"),
sort(Sort.Direction.DESC, "count"),
limit(1));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
long shopId = (long) result.getMappedResults().get(0).get("_id");
int count = (int) result.getMappedResults().get(0).get("count");
System.out.println(shopId);
System.out.println(count);
}
@Test
public void test08() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
project().andExpression("{$dateToString:{format:'%Y-%m-%d',date: '$createTime'}}").as("createTime"),
group("createTime").count().as("count"),
sort(Sort.Direction.DESC, "count"),
limit(1));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
String day = (String) result.getMappedResults().get(0).get("_id");
int count = (int) result.getMappedResults().get(0).get("count");
System.out.println(day);
System.out.println(count);
}
@Test
public void test09() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)
.and("createTime").gte(DateUtils.fromString("2018-01-01 16:00:57", "yyyy-MM-dd HH:mm:ss")).lte(new Date())),
project("payAmount").andExpression("{$dateToString:{format:'%Y-%m-%d',date: '$createTime'}}").as("createTime"),
group("createTime").sum("payAmount").as("total"),
sort(Sort.Direction.DESC, "total"),
limit(1));
AggregationResults<BasicDBObject> result =
mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
String day = (String) result.getMappedResults().get(0).get("_id");
BigDecimal amount = ((Decimal128)result.getMappedResults().get(0).get("total")).bigDecimalValue();
System.out.println(day);
System.out.println(amount);
}
@Test
public void test10() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
sort(Sort.Direction.DESC, "payAmount"),
limit(3));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
List<MOrder> orders = new ArrayList<>(3);
for (BasicDBObject bd : result.getMappedResults()) {
MOrder order = new MOrder();
order.setOrderId(bd.getString("orderId"));
order.setPayAmount((Decimal128) bd.get("payAmount"));
order.setShopId(bd.getLong("shopId"));
order.setCreateTime(bd.getDate("createTime"));
orders.add(order);
}
System.out.println(orders);
}
@Test
public void test11() {
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("userId").is(8744L)),
sort(Sort.Direction.ASC, "createTime"),
limit(1));
AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(aggregation, MOrder.class, BasicDBObject.class);
BasicDBObject bd = result.getMappedResults().get(0);
MOrder order = new MOrder();
order.setOrderId(bd.getString("orderId"));
order.setPayAmount((Decimal128) bd.get("payAmount"));
order.setShopId(bd.getLong("shopId"));
order.setCreateTime(bd.getDate("createTime"));
System.out.println("第一笔交易时间为 " + DateUtils.formatToString(order.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
System.out.println("第一笔交易金额为 " + order.getPayAmount().bigDecimalValue().setScale(2, BigDecimal.ROUND_HALF_DOWN));
System.out.println("第一笔交易商家id为 " + order.getShopId());
System.out.println("第一笔交易订单号为 " + order.getOrderId());
}
@Test
public void test12() {
Long userId = 1L;
Aggregation agg = Aggregation.newAggregation(
match(
Criteria.where("userId").is(userId)
.and("afterUserType").is("FORMAL_VIP")),
sort(Sort.Direction.ASC, "startTime"),
limit(1));
AggregationResults<BasicDBObject> result1 = mongoTemplate.aggregate(agg, MVipRecord.class, BasicDBObject.class);
agg = Aggregation.newAggregation(
match(
Criteria.where("startTime")
.lt(result1.getMappedResults().get(0).getDate("startTime"))));
AggregationResults<BasicDBObject> result2 = mongoTemplate.aggregate(agg, MVipRecord.class, BasicDBObject.class);
int count = result2.getMappedResults().size() + 1;
System.out.println("您成为会员的时间:" + DateUtils.formatToString(result1.getMappedResults().get(0).getDate("startTime"), "yyyy-MM-dd hh:mm:ss"));
System.out.println("您是第" + count + "位会员");
}
@Test
public void test13() {
Instant start = Instant.now();
Long userId = 1L;
Aggregation agg = Aggregation.newAggregation(
match(Criteria.where("userId").is(userId)));
AggregationResults<BasicDBObject> result1 = mongoTemplate.aggregate(agg, MUser.class, BasicDBObject.class);
agg = Aggregation.newAggregation(
match(
Criteria.where("createTime")
.lt(result1.getMappedResults().get(0).getDate("createTime"))),
project("userId"));
AggregationResults<BasicDBObject> result2 = mongoTemplate.aggregate(agg, MUser.class, BasicDBObject.class);
int count = result2.getMappedResults().size() + 1;
System.out.println("您成为用户的时间:" + DateUtils.formatToString(result1.getMappedResults().get(0).getDate("createTime"), "yyyy-MM-dd hh:mm:ss"));
System.out.println("您是第" + count + "位注册用户");
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
}