mongodb 按照时间聚类 java
时间:2022-03-14 06:25
当存储到mongodb中的是string类型的时间,小tips:
1. 那么在对此域按照时间聚类(每周,每月)时就不能直接使用mongodb的time关键字了,因为mongodb有自己的时间类型,且目前它只认可自己的时间类型。
2. 假如对于时间进行简单的聚类,比如按照年,月,日,时,分,秒来聚类,我们可以使用mongodb的substr关键字模拟出mongodb能够认可的时间类型。
比如 2015-03-02 22:53:45 ---> 2014 这样截取出year,2014-03-02就是截取出day。
3. 按照季度或者星期来聚类时就有些麻烦了, 这时需要我们先分别按照月,日来进行一步聚类,将聚类后的中间结果在java中完成二次聚类。比如以星期进行聚类时需要先按照day来取,再结合java的calendar来得出星期
project可以对值进行更名操作以及concat, substr, add, mutiply, mod 操作 $group 最重要的,聚类操作。 group必须有_id属性,用来标识那些被聚集的属性。但是_id的值可以为null,用于求和求平均。 在group的时候可以同时对属性名称进行修改 $group: { $_id : {month: {$month: "$date"}, day: {$day: "$date"}}, $totalPrice: {$sum: {$multiply: ["$price", "$quantity"]}}, $averagePrice: {$avg: ["$price"]}, count: {$sum, 1} } _id, totalPrice, averagePrice, count 都会分别作为一个属性返回。 另外的属性还包括 $sort, 按照某个属性排序 {$sort: {age: 1, money: -1}} $skip, $limit 表示越过多少或者仅返回多少条目。 $unwind 将数组的元素拆开。 $out 表示为输出的结果新建一个collection {$out: "authors"} ,它必须作为最后pipeline的最后一个stage 一个聚类的例子,完全使用java实现 上面的代码中DBObject的组装相当麻烦且看不出json的架构,因为一个更好的做法是从json转化
DBObject fields = new BasicDBObject("url", "$uri")
DBObject project = new BasicDBObject("$project", fields)
DBObject idField = new BasicDBObject("_id", new BasicDBObject("url", "$url"));
idField.put("count", new BasicDBObject("$sum", 1));
DBObject group = new BasicDBObject("$group", idField);
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("count", -1));
List<DBObject> pipeline = Arrays.asList(project, group, sort);
AggregationOutput output = collection.aggregate(pipeline);
for(DBObject result: output.results())
System.out.println(result)
DBObject project = JSON.parse("{$project: {"url": \"$uri\"}}")
DBObject group = JSON.parse("{$group: {_id: {"url": "$url"}}}")
DBObject sort = JSON.parse("{$sort: {count: -1}}")