最初の質問に答えるには:$group
しない 順序を保持します。背景を少し強調する変更の未解決のリクエストがありますが、入力ドキュメントの順序を維持するために製品が変更されるようには見えません:
- https://jira.mongodb.org/browse/SERVER-24799 >
- https://jira.mongodb.org/browse/SERVER-4507 >
- https://jira.mongodb.org/browse/SERVER-21022 >
一般的に言えば、2つのことが言えます。通常、最初にグループ化してから、並べ替えを実行します。その理由は、(グループ化によって一般的に生成される)要素の並べ替えが、すべての入力ドキュメントの並べ替えよりも高速になるためです。
第二に、MongoDBは、可能な限り効率的かつ少ないソートを確実にする予定です。 ドキュメント 状態:
したがって、このコードはあなたのケースで仕事を成し遂げます:
collection.aggregate({
$group: {
_id: '$age',
names: { $push: '$name' }
}
}, {
$sort: {
'_id': 1
}
}, {
$limit: 10
})
編集 コメントをフォローする:
私はあなたの言うことに同意します。そして、あなたの論理をもう少し進めて、私は言うところまで行きます:もし$group
インデックスを使用するのに十分賢いので、$sort
も必要ありません。 スタート時のステージ。残念ながら、そうではありません(まだおそらくそうではありません)。今日の状況では、$group
インデックスを使用することはなく、次の段階($limit
)に基づくショートカットは使用されません。 この場合)。こちらの
集約フレームワークはまだかなり若いので、集約パイプラインをよりスマートかつ高速にするために多くの作業が行われていると思います。
StackOverflowにはここに回答があります(例:こちら
)人々が前払いの$sort
を使用することを提案する場合 なんらかの方法でMongoDBにインデックスを使用するように「強制」するためのステージ。ただし、これによりテストが大幅に遅くなりました(さまざまなランダム分布を使用したサンプル形状の100万レコード)。
集計パイプラインのパフォーマンスに関しては、$match
開始時のステージは、本当に最も役立つものです。最初からパイプラインを通過する必要のあるレコードの総数を制限できる場合は、それが最善の策です-明らかに...;)