51

たとえば、次のようなコレクションがあります。

{市場:'SH'、コード: '000001'、日付: '2012-01-01'、価格:1000}
{市場:'SZ'、コード: '000001'、日付: '2012-01-01'、価格:1000}
{市場:'SH'、コード: '000001'、日付: '2012-01-02'、価格:1000}
{市場:'SZ'、コード: '000001'、日付: '2012-01 -02'、価格:1000}
{市場:' SH'、コード:' 000002'、日付:' 2012-01-03'、価格:1000}
.. ..

このコレクションには、数千万のドキュメントが含まれています。

2つのキーで個別に呼び出したい:

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

そして結果を得る:

[{マーケット:'SH'、コード: '000001'}、{マーケット:'SZ'、コード: '000001'}、{マーケット:'SH'、コード: '000002'}]

ネイティブのdistinctコマンドは1つのキーしか受け入れないため、map-reduceを使用して実装しようとしています。しかし、map-reduceは、ネイティブに区別するには遅すぎます。私のワンキー個別テストでは、map-reduceはネイティブ個別の約10倍の費用がかかります。
マルチキー個別を実装する効率的な方法はありますか?

4

1 に答える 1

107

MongoDBの次の2.2リリースを待つ場合は、集約フレームワークを使用してこのクエリを効率的に実行できます。

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

私のテストマシンの100万レコードのコレクションでは、これは4秒で実行されましたが、map/reduceバージョンは1分以上かかりました。

于 2012-08-16T16:44:31.710 に答える