场景: 使用mongo 存网站访问日志 ,并对其统计分析 。
核心代码如下:
Bson liveBson = Filters.and(Filters.gte("time", strToLongSafe(start)), Filters.lte("time", strToLongSafe(end))
, Filters.eq("response_code", "200"),
Filters.regex("url", "/register/"),
Filters.regex("referrer", "www.xiucai.com/live/\\d+"));
collection.find(liveBson).forEach((Consumer<? super Document>) item -> {
System.out.println(item);
});
Document filter = new Document();
filter.append("time", new Document("$gte", strToLongSafe(start)));
filter.append("time", new Document("$lte", strToLongSafe(end)));
filter.append("response_code", new Document("$eq", "200"));
filter.append("url", new Document("$regex", "/register/"));
filter.append("referrer", new Document("$regex", "www.xiucai.com/live/\\d+"));
Document group = new Document();
group.append("_id", "$channel");//根据渠道来分组
group.append("count", new Document("$sum", 1));
Document match = new Document("$match", filter);
Document groupd = new Document("$group", group);
List docList = new ArrayList();
docList.add(match);
docList.add(groupd);//注意先match 后 group by
collection.aggregate(docList).forEach((Consumer<? super Document>) item -> {
System.out.println(item);
});
遇到的坑: 使用 aggregate 聚合如果把聚合的顺序写反 $group 在前 $match 在后 得不到数据 ,
编码小窍门: 类SQL一样先 where 后 group by