13

MongoDB で通常の「検索」クエリを実行すると、返されたカーソルに対して「カウント」を実行することで、(制限に関係なく) 結果の合計数を取得できます。したがって、結果セットを 10 に制限しても (たとえば)、結果の総数が 53 であることがわかります (これもたとえば)。

ただし、正しく理解していれば、集計フレームワークはカーソルを返さず、単に結果を返します。それで、$limitパイプライン演算子を使用した場合、上記の制限に関係なく、結果の総数をどのように知ることができますか?

集計を 2 回実行できると思いますが (1 回は を介し​​て結果をカウントし、$group1 回$limitは実際の限定された結果をカウントします)、これは非効率的です。

$group別のアプローチとして、操作の前に( を介して) 結果の総数をドキュメントに添付することもできますが$limit、この数はすべてのドキュメントに添付されるため (セットに対して 1 回だけ返されるのではなく)、これも非効率的と思われます。

ここで何か不足していますか?何か案は?ありがとう!

たとえば、これがクエリの場合:

db.article.aggregate(
    { $group : {
        _id : "$author",
        posts : { $sum : 1 }
    }},
    { $sort : { posts: -1 } },
    { $limit : 5 }
);

( の前に) 利用可能な結果の数を知るにはどうすればよい$limitですか? 結果はカーソルではないので、単にカウントすることはできません。

4

7 に答える 7

2

Assaf、近い将来、集計フレームワークにいくつかの機能強化が行われる予定です。これにより、簡単に 1 回のパスで計算を実行できるようになる可能性がありますが、現時点では、2 つのクエリを並行して実行して計算を実行することをお勧めします。上位の投稿者の #posts と、すべての投稿者の合計投稿数を計算するための別の集計です。また、ドキュメントの数だけを計算する必要がある場合は、count 関数を使用すると計算を効率的に実行できます。MongoDB は btree インデックス内にカウントをキャッシュし、クエリのカウントを非常に迅速に行うことができます。

これらの集計が遅いことが判明した場合、いくつかの戦略があります。まず、結果セットを減らすために、該当する場合は $match でクエリを開始する必要があることに注意してください。$matches は、インデックスによって高速化することもできます。次に、これらの計算を事前集計として実行できます。ユーザーがアプリの一部にアクセスするたびにこれらの集計を実行する代わりに、集計をバックグラウンドで定期的に実行し、事前に集計された値を含むコレクションに集計を保存します。このようにして、ページはこのコレクションから事前に計算された値を簡単に照会できます。

于 2013-07-22T01:15:36.343 に答える