LoginSignup
12
8

More than 5 years have passed since last update.

複数キーでのdistinctをaggregationで実現する

Posted at

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"
        }
    }
]


*/
12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8