1. ホーム
  2. mongodb

[解決済み] 複数のキーで "distinct "を効率的に実行するには?

2022-03-03 10:04:44

質問

例えば、こんなコレクションがあります。

{market: 'SH', code: コード: '000001', 日付: '2012-01-01', 価格: 1000}.
{market: 'SZ', code: コード: '000001', 日付: '2012-01-01', 価格: 1000}.
{market: 'SH', code: コード: '000001', 日付: '2012-01-02', 価格: 1000}.
{market: 'SZ', code: コード: '000001', 日付: '2012-01-02', 価格: 1000}.
{market: 'SH', code: 000002'、日付:'2012-01-03'、価格:1000}。
...

このコレクションには数千万件の文書が含まれています。

2つのキーでdistinctを呼び出したい。

collection.distinct('market', 'code');

そして、結果を得る。

[マーケット:'SH', コード:'000001'}, {market: 'SZ', code:'000001'}, {マーケット:'SH', コード:'000002'}].

native distinctコマンドは1つのキーしか受け付けないため、map-reduceで実装しようとしました。しかし、map-reduceはnative distinctよりはるかに遅い。私の1キーdistinctのテストでは、map-reduceはnative distinctの約10倍の時間を費やした。
マルチキーの区別を効率的に実装する方法はありますか?

どのように解決するのですか?

MongoDB の次期 2.2 リリースを待ってもいいなら、aggregation フレームワークを使ってこのクエリを効率的に実行することができます。

collection = db.tb;
result = collection.aggregate( 
            [
                {"$group": { "_id": { market: "$market", code: "$code" } } }
            ]
        );
printjson(result);

テストマシンで100万レコードのコレクションを実行したところ、map/reduceバージョンでは1分以上かかったのに対し、4秒で実行できました。