概要:
- 查询出消费的订单,并查看订单数排行前十名的会员
- 并找到我在这个排行榜上排第几名
MongoDB的版本
db.version();
console.info("版本号:","2.4.6");
/**
* 由于线上的MongoDB版本比较低,对上面的需求查询 比较吃力
*/
原始数据
排序后 前十数据
db.WithdrConsumerRecord.aggregate([{
$match: { //过滤:根据公司ID
companyId: "55e65986cb0d7463a708d004"
}
},
{
"$group": { //分组:根据用户ID
_id: "$recommendOpenId",
count: {
$sum: 1 //计算订单表里 有多少订单
},
ordertime: {
$first: "$orderTime" //第一次下单的时间
}
}
},
{
$sort: { //排序
"count": -1,
"ordertime": -1
}
},
{
$limit: 10 //返回前十条数据
},
{
$project: { //列别名
"用户ID": "$_id",
"订单时间": "$ordertime",
"数量": "$count"
}
}]);
结果集:
查找我的排名
第一步:查看我的订单数量
db.WithdrConsumerRecord.aggregate([{
$match: { //过滤:根据公司ID
companyId: "55e65986cb0d7463a708d004"
}
},
{
"$group": { //分组:根据用户ID
_id: "$recommendOpenId",
count: {
$sum: 1 //计算订单表里 有多少订单
},
ordertime: {
$first: "$orderTime" //第一次下单的时间
}
}
},
{
$sort: { //排序
"count": -1,
"ordertime": -1
}
},
{
$limit: 10 //返回前十条数据
},
/**
*
* 添加过滤:根据 我的 用户ID
*/
{
$match: {
_id: "oLI_KjthqpO6lqERksVA5UaNKhPg"
}
},
{
$project: { //列别名
"用户ID": "$_id",
"订单时间": "$ordertime",
"数量": "$count"
}
}]);
结果集:
查看我的排名:
第二步: 进行统计 比我订单数多的用户有多少
db.WithdrConsumerRecord.aggregate([{
$match: { //过滤:根据公司ID
companyId: "55e65986cb0d7463a708d004"
}
},
{
"$group": { //分组:根据用户ID
_id: "$recommendOpenId",
count: {
$sum: 1 //计算订单表里 有多少订单
},
ordertime: {
$first: "$orderTime" //第一次下单的时间
}
}
},
{
$sort: { //排序
"count": -1,
"ordertime": -1
}
},
{
$match: {
"count": {
$gte: 23
}
}
},
{
$group: {
_id: null,
count: {
$sum: 1
}
}
}
]);
结果集:
java代码
public List<MarketingFan> getRankingByOrderCount(Company company) {
DBCollection coll = withdrConsumerRecordDao.createQuery().getCollection();
ArrayList<DBObject> list = new ArrayList<DBObject>();
DBObject matchFields = new BasicDBObject("companyId", company.getId());
BasicDBObject matchOpt = new BasicDBObject("$match", matchFields);
DBObject groupOpt = new BasicDBObject();
DBObject groupFields = new BasicDBObject("_id", "$recommendOpenId");
groupFields.put("count", new BasicDBObject("$sum", 1));
groupOpt.put("$group", groupFields);
DBObject sortFields = new BasicDBObject("count", -1);
DBObject sortOpt = new BasicDBObject("$sort", sortFields);
list.add(matchOpt);
list.add(groupOpt);
list.add(sortOpt);
Iterator<DBObject> iter = coll.aggregate(list).results().iterator();
List<MarketingFan> lists = new ArrayList<MarketingFan>();
while (iter.hasNext()) {
DBObject obj = (DBObject) iter.next();
String recommendOpenId = obj.get("_id").toString();
int count = Integer.valueOf(obj.get("count").toString());
MarketingFan mark = new MarketingFan();
mark.setOpenId(recommendOpenId);
mark.setFanNums(count);
lists.add(mark);
}
return lists;
}