mongodbでキーのdistinctを実現しようとするとき、大抵mapReduceを用いていたのですが、最近流行り?のaggregation frameworkを用いて実現できることに最近気が付きました。
前提
以下のようなデータをinsert済みと仮定します。
data.js
var data = [
{first_name: 'aa', family_name: 'xx', old:12},
{first_name: 'bb', family_name: 'xx', old:13},
{first_name: 'cc', family_name: 'xx', old:14},
{first_name: 'aa', family_name: 'yy', old:15},
{first_name: 'bb', family_name: 'yy', old:16},
{first_name: 'cc', family_name: 'yy', old:17},
{first_name: 'aa', family_name: 'xx', old:18},
{first_name: 'bb', family_name: 'yy', old:19}
];
db.person.insert(data);
方法
aggregationの$groupにおいて、_idの値に元のコレクションのdistinctしたいキーを{hg: '$hoge', fg: '$fuga'}
で指定して上げるだけです。
以下、例。
multikey_distinct.js
var result = db.person.aggregate(
{
$group:{
_id:{
fi: '$first_name',
fa: '$family_name'
}
}
}
);
printjson(result.result);
/* 出力
[
{
"_id" : {
"fi" : "cc",
"fa" : "yy"
}
},
{
"_id" : {
"fi" : "bb",
"fa" : "yy"
}
},
{
"_id" : {
"fi" : "aa",
"fa" : "yy"
}
},
{
"_id" : {
"fi" : "cc",
"fa" : "xx"
}
},
{
"_id" : {
"fi" : "bb",
"fa" : "xx"
}
},
{
"_id" : {
"fi" : "aa",
"fa" : "xx"
}
}
]
*/