sql >> データベース >  >> NoSQL >> MongoDB

パイプラインを使用してMongoで効率的に並べ替え、グループ化、制限することは可能ですか?

    最初の質問に答えるには:$group しない 順序を保持します。背景を少し強調する変更の未解決のリクエストがありますが、入力ドキュメントの順序を維持するために製品が変更されるようには見えません:

    一般的に言えば、2つのことが言えます。通常、最初にグループ化してから、並べ替えを実行します。その理由は、(グループ化によって一般的に生成される)要素の並べ替えが、すべての入力ドキュメントの並べ替えよりも高速になるためです。

    第二に、MongoDBは、可能な限り効率的かつ少ないソートを確実にする予定です。 ドキュメント 状態:

    したがって、このコードはあなたのケースで仕事を成し遂げます:

    collection.aggregate({
        $group: {
            _id: '$age',
            names: { $push: '$name' }
        }
    }, {
        $sort: { 
            '_id': 1 
        }
    }, {
        $limit: 10
    })
    

    編集 コメントをフォローする:

    私はあなたの言うことに同意します。そして、あなたの論理をもう少し進めて、私は言うところまで行きます:もし$group インデックスを使用するのに十分賢いので、$sortも必要ありません。 スタート時のステージ。残念ながら、そうではありません(まだおそらくそうではありません)。今日の状況では、$group インデックスを使用することはなく、次の段階($limit)に基づくショートカットは使用されません。 この場合)。こちらのリンク もご覧ください。 誰かがいくつかの基本的なテストを実行した場所。

    集約フレームワークはまだかなり若いので、集約パイプラインをよりスマートかつ高速にするために多くの作業が行われていると思います。

    StackOverflowにはここに回答があります(例:こちら )人々が前払いの$sortを使用することを提案する場合 なんらかの方法でMongoDBにインデックスを使用するように「強制」するためのステージ。ただし、これによりテストが大幅に遅くなりました(さまざまなランダム分布を使用したサンプル形状の100万レコード)。

    集計パイプラインのパフォーマンスに関しては、$match 開始時のステージは、本当に最も役立つものです。最初からパイプラインを通過する必要のあるレコードの総数を制限できる場合は、それが最善の策です-明らかに...;)




    1. MongoDB C#Aggregation-unwind-> groupBy

    2. オブジェクトを配列に入力する

    3. データベースクラスター全体でのメンテナンスウィンドウの簡単なスケジューリング

    4. すべてのサブドキュメントのObjectIdを作成していないMongoose自己参照スキーマ