3

私はmongodbに、約100 000のドキュメント(シャーディングされていない)を含むかなり大きなコレクションを持っています。これは、基本的にユーザーがこのコレクション内の同じ情報を表示するためにさまざまな方法を参照できるようにするWebアプリケーションのバックエンドです。

ビューの1つとして、集計フレームワークを使用してフィールドの出現回数をカウントしようとしています。これは、コレクション全体を集約することを意味します。問題は、この集計操作(グループ、並べ替え、制限の単純なパイプライン)に2秒かかることです。これは、Webアプリケーションには遅すぎます。

だから私の質問は; この集計操作の結果をキャッシュするための推奨されるソリューションは何ですか?私が見つけた限りでは、新しいコレクションなどに「集約」することはできません。現時点で私が見つけた唯一の解決策は、結果全体を変数に読み込んでから、insertを使用してこの変数を新しいコレクションに挿入することです-しかし、これにはデータベースからアプリケーションに大量のデータを送信することが含まれるのではないかと心配しています=>データベースに戻りますか?

助言がありますか?

パイプラインの例:

res = items.aggregate([
    { "$group": { "_id": { "item_id": "$item_id", "title": "$title", "category": "$category" }, "count": { "$sum": 1 } } },
    { "$sort": { "count": -1 } },
    { "$limit": 5 }
])

スキーマは基本的にこれらの3つのフィールドと、実際には関係のないいくつかのフィールドです。

doc = {
    "item_id": 1000,
    "title": "this is the item title",
    "category": "this is the item category"
}

item_idと3つのフィールドすべてのインデックスを試しましたが、成功しませんでした。

4

1 に答える 1

1

集計は結果を1つのドキュメントに返します。結果は16Mに制限されます。ドキュメントはアプリに返されます。

コレクションに「集約」したい場合は、map-reduceを使用してください。

map_function = function () {
        emit(this.item_id, {"item_id": this.item_id, /* any other info */ "count": 1});
};

reduce_function = function (key, values) {
        var result = {"item_id": key, /* any other info should be given from one or any of values array objects */ "count": 0};
        values.forEach(function (value) {
                result["count"] += value["count"];
        });
        return result;
};

構造値を出力できるかどうかわからない-試してみてください。ところで、キーフィールドを放出するのは良いことです。

于 2013-02-04T11:17:50.900 に答える