MongoDBグループ
23380 ワード
MongoDBの3種類のグループ化方式 group(フィルタリングしてからグループ化し、スライスをサポートせず、データ量に制限があり、効率が高くない)【単純グループ実測150 W 12.5 s】 mapreduce(jsエンジンに基づいて、単一スレッドで実行され、効率が低く、バックグラウンド統計などに適している)【単純パケット実測150 W 28.5 s】 aggregate(推奨)[簡易パケット実測150 W 2.6 s] group
MapReduce
Mongodb公式サイトはMapReduceについて紹介します.
Map/reduce in MongoDB is useful for batch processing of data and aggregation operations. It is similar in spirit to using something like Hadoop with all input coming from a collection and output going to a collection. Often, in a situation where you would have used GROUP BY in SQL, map/reduce is the right tool in MongoDB.
MongodbのMap/reduceは主にデータの一括処理と集約操作に用いられており、Hadoopを用いて集合データを処理するのと少し似ており、すべての入力データは集合から取得され、MapReduce後に出力されたデータも集合に書き込まれる.通常、SQLでGroupBy文を使用するのと同じです.
MapReduceを使用して、MapとReduceの2つの関数を実装します.Map関数はemit(key,value)を呼び出して集合内のすべてのレコードを遍歴し,keyとvalueをReduce関数に渡して処理する.Map関数とReduce関数はJavascriptを用いて記述され、dbを通過することができる.runCommandまたはmapreduceコマンドは、MapReduce操作を実行します.
Aggregate
Javaコード実装:
1
2
3
4
5
6
7
8
9
10
11
12
統計aggregateの行数 Use Use
Code:
Output:
リファレンス
http://stackoverflow.com/questions/13529323/obtaining-group-result-with-group-count
http://www.cnblogs.com/shanyou/p/3494854.html
http://www.cnblogs.com/fx2008/p/3572169.html
コード#コード#
https://github.com/JeromeSuz/demo_nosql
db.ad_play_log.group({
// https://docs.mongodb.org/manual/reference/method/db.collection.group/
// https://docs.mongodb.org/manual/reference/command/group/#dbcmd.group
key: {
//
ad_position_id: 1
},
cond: {
// WHERE
ord_dt: {
$gt: new Date('01/01/2012')
}
},
reduce: function (curr, result) {
result.count++;
},
initial: {
count: 0
}
});
// SELECT ad_play_log, SUM(material_id) as total
// FROM orders
// WHERE ord_dt > '01/01/2012'
// GROUP BY ad_position_id
MapReduce
db.runCommand({
mapreduce: "ad_play_log",
map: function Map() {
var key = {
ad_position_id: this.ad_position_id
};
var value = {
count: 1
};
/**
* key value reduce
* @param key
* @param value
*/
emit(key, value);
},
reduce: function Reduce(key, values) {
var ret = {
count: 0
};
for (var i in values) {
ret.count += 1;
}
return ret;
},
out: {
inline: 1
}
});
Mongodb公式サイトはMapReduceについて紹介します.
Map/reduce in MongoDB is useful for batch processing of data and aggregation operations. It is similar in spirit to using something like Hadoop with all input coming from a collection and output going to a collection. Often, in a situation where you would have used GROUP BY in SQL, map/reduce is the right tool in MongoDB.
MongodbのMap/reduceは主にデータの一括処理と集約操作に用いられており、Hadoopを用いて集合データを処理するのと少し似ており、すべての入力データは集合から取得され、MapReduce後に出力されたデータも集合に書き込まれる.通常、SQLでGroupBy文を使用するのと同じです.
MapReduceを使用して、MapとReduceの2つの関数を実装します.Map関数はemit(key,value)を呼び出して集合内のすべてのレコードを遍歴し,keyとvalueをReduce関数に渡して処理する.Map関数とReduce関数はJavascriptを用いて記述され、dbを通過することができる.runCommandまたはmapreduceコマンドは、MapReduce操作を実行します.
Aggregate
db.ad_play_log.aggregate(
{
//https://docs.mongodb.org/manual/reference/method/db.collection.aggregate/
//
$group: {
// ad_position_id
_id: "$ad_position_id",
count: {
// count
$sum: 1
},
total: {
// material_id
$sum: "$material_id"
}
}
},
{
$sort: {
// ad_position_id ,-1
_id: -1
}
},
{
// ,
$limit: 10
},
{
// , , $group , 613 700
$match: {_id: 613, count: {$lt: 700}}
}
// == SELECT ad_position_id,count(1) AS count FROM ad_play_log GROUP BY ad_position_id
);
Javaコード実装:
1
2
3
4
5
6
7
8
9
10
11
12
public
void
test_aggregate() {
// https://docs.mongodb.org/getting-started/java/aggregation/
MongoCollection collection = MongoUtil.getCollection(
"ad_play_log"
);
AggregateIterable iterable = collection.aggregate(asList(
new
Document(
"$group"
,
new
Document(
"_id"
,
"$ad_position_id"
).append(
"count"
,
new
Document(
"$sum"
,
1
)))));
iterable.forEach(
new
Block() {
@Override
public
void
apply(
final
Document document) {
System.out.println(document.toJson());
}
});
}
統計aggregateの行数
$project
to save tag
and count
into tmp
$push
or addToSet
to store tmp
into your data
list. Code:
db.test.aggregate({$unwind:'$tags'},{$group:{_id:'$tags', count:{$sum:1}}},{$project:{tmp:{tag:'$_id', count:'$count'}}},{$group:{_id:null, total:{$sum:1}, data:{$addToSet:'$tmp'}}})
Output:
{"result":[{"_id":null,"total":5,"data":[{"tag":"SOME","count":1},{"tag":"RANDOM","count":2},{"tag":"TAGS1","count":1},{"tag":"TAGS","count":1},{"tag":"SOME1","count":1}]}],"ok":1}
リファレンス
http://stackoverflow.com/questions/13529323/obtaining-group-result-with-group-count
http://www.cnblogs.com/shanyou/p/3494854.html
http://www.cnblogs.com/fx2008/p/3572169.html
コード#コード#
https://github.com/JeromeSuz/demo_nosql