3

MongoDB コレクションをいくつかのキーで昇順にソートしたいのですが、キーを持たないレコードを最後にする必要があります。例えば

db.coll.find({}, {key: 1}).sort({key: 1})

与えます:

{_id: 1}
{_id: 2, key: 1}
{_id: 3, key: 2}

ただし、代わりに次を指定する必要があります。

{_id: 2, key: 1}
{_id: 3, key: 2}
{_id: 1}

MongoDB でこれを行う方法はありますか?

4

4 に答える 4

3

これは不可能です。ドキュメントを作成するときは、「キー」を理論上の最大値に設定する必要があります。別の方法として、2 つのクエリを実行することもできます (1 つは「キー」が存在する場所をすべて並べ替えて取得するもので、もう 1 つは必要に応じて結果セットを補完するために「キー」がまったく設定されていないオプションです)。通常、後者はさまざまなビジネス ルールの制約により不可能です。

于 2013-05-29T09:06:24.893 に答える
3

残念ながら、mongoDBは「異なるBSONタイプの値を比較する場合、MongoDBは次の比較順序を最低から最高まで使用します:」DOCS

  1. MinKey (内部型)
  2. ヌル
  3. 数値 (int、long、double)
  4. シンボル、文字列
  5. 物体
  6. 配列
  7. BinData
  8. オブジェクト ID
  9. ブール値
  10. 日付、タイムスタンプ
  11. 正規表現
  12. MaxKey (内部型)

mongo がインデックスを生成すると、キーを取得していないドキュメントの null が含まれます。最初の予備のインデックスを使用して、2 つのクエリでそれを行うことができます。

キー フィールドにスペア インデックスを定義すると、ソートは値を持つものだけを返します。これは、キーを持たないドキュメントを除外します。ドキュメント

于 2013-05-29T11:36:16.827 に答える
1

これはおそらく集計フレームワークを使用して実行できますが、かなり面倒です。不足しているキーを有効なキーよりも高いマーカー値に置き換える必要があります (キーが正規表現でない限り、持っているキーのタイプの後にソートされるタイプのキーを使用することで簡単です)、コレクションをソートします。次に、マーカー値を取り除きます。

を使用して 2 つの通常のクエリで実行する方が効率的です$exist

于 2013-05-30T05:17:47.953 に答える