2

db.Collection.find().sort() を実行するたびに、コレクション自体ではなく、出力のみがソートされます。

つまり、db.collection.find() を実行すると、ソートされたコレクションではなく、元のコレクションが表示されます。

出力をソートするだけでなく、コレクション自体をソートする方法はありますか?

ソートされた結果を新しいコレクション全体にエクスポートすることもできます。

_id フィールドに番号が付けられている場合 ( _id:1 、 _id_2 、 _id:3 など)

4

2 に答える 2

6

また、これを行う理由がわかりません(ソートしようとしているフィールドのインデックスは、このソートを高速化するのに役立ちます)、ここに問題の解決策があります:

このようにしてテストコレクションを取得します

{ "_id" : ObjectId("5273f6987c6c502364ddfe94"), "n" : 5 }
{ "_id" : ObjectId("5273f6e57c6c502364ddfe95"), "n" : 14}
{ "_id" : ObjectId("5273f6ee7c6c502364ddfe96"), "n" : -5}

次に、次のコマンドでソートされたコレクションが作成されます

db.test.find().sort({n : 1}).forEach(function(e){
  db.testSorted.insert(e);
})

これで達成できるのとまったく同じ方法です(これはより高速に実行されると思いますが、テストは行っていません):

db.testSorted.insert(db.test.find().sort({n : 1}).toArray());

そして、この回答を完全にするために、これはやり過ぎであることも理解しています。集計フレームワークオプション $outを使用してこれを行うことができます。

強調するだけです:これにより、より大きな問題を解決できます。以前のコレクションの何らかの変更/サブセットを別のコレクションに保存します。

于 2013-11-01T18:59:24.280 に答える
0

コレクション内のドキュメントは自然な順序で保存され、ドキュメントの移動 (現在割り当てられているレコード領域よりもドキュメントが大きくなった場合) や削除 (ドキュメントの挿入/移動のために空き領域を再利用できます) の影響を受けます。現在 (MongoDB 2.4 のように)キャップ付きコレクションを使用する以外に、ディスク上のドキュメントの順序を制御するオプションはありません。これは、挿入順序を維持する固定サイズのコレクションですが、いくつかの制限があります。

インデックスは、予想される並べ替え順序でドキュメントを効率的に返すための適切な方法です。詳細については、MongoDB マニュアルの「インデックスを使用してクエリ結果を並べ替える」を参照してください。

関連する機能として、インデックスの順序に合わせてドキュメントをディスクに保存するクラスター化インデックスがあります。これはリクエストされていますが、MongoDB の現在の機能ではありません ( SERVER-3294を参照)。

于 2013-11-03T05:03:43.423 に答える