7

コレクションを文字列フィールド (ここでは ) で並べ替えようとすると、並べ替えTitleが期待どおりに機能しません。下記を参照してください:

db.SomeCollection.find().limit(50).sort({ "Title" : -1 });

実績順

  • "タイトル" : "geog.3 生徒の本"
  • "タイトル" : "geog.2 生徒の本"
  • 「タイトル」:「geog.1学生の本」
  • 「タイトル」:「ゾーイとスウィフト」
  • 「タイトル」:「テーマパークでジップ」
  • 「タイトル」:「スーパーマーケットでジップ」

期待される結果の順序

  • 「タイトル」:「ゾーイとスウィフト」
  • 「タイトル」:「テーマパークでジップ」
  • 「タイトル」:「スーパーマーケットでジップ」
  • "タイトル" : "geog.3 生徒の本"
  • "タイトル" : "geog.2 生徒の本"
  • 「タイトル」:「geog.1学生の本」

日付フィールドで並べ替えようとすると、同じ問題が発生します。

助言がありますか?

4

5 に答える 5

6

更新: バージョン 3.4 には大文字と小文字を区別しないインデックスがあります

これは既知の問題です。MongoDB は、文字列の字句ソートをサポートしていません ( JIRA: 文字列辞書式順序付け)。アプリケーション コードで結果を並べ替えるか、数値フィールドを使用して並べ替える必要があります。ただし、日付フィールドを確実にソートする必要があります。日付による並べ替えが機能しない例を教えてください。

于 2013-11-08T09:11:48.250 に答える
3

何があなたを驚かせますか?

シンボルの数値表現の表示に基づいてソートします。ここを見てください(mongodbは文字列をUTF-8で保存することを知っているので、これは教育目的のためだけです)。大文字に対応する数字が小文字よりも小さいことがわかります。したがって、彼らは前に行きます。

Mongodb は、ローカリゼーションまたは大文字と小文字の区別に基づいて文字を並べ替えることができません。

あなたの場合g、より大きな数がZあるので、それが最初になります(降順でソート)。そして とより3高い対応する数を持っています。したがって、基本的にすべてが正しいです。21

于 2013-11-08T09:22:33.820 に答える
2

日付が正しくソートされていないことから始めて....

日付を として保存する場合はstring、文字列としてソート可能である必要があります。それは非常に簡単です:

2013-11-08  // yyyy-mm-dd (the dashes would be optional)

日付文字列のすべての部分が正しくパディングされている限り0、文字列はすべて自然に、期待どおりに並べ替えられます。

通常、完全な日時は UTC で保存されます。

2013-11-23T10:46:01.914Z

ただし、日付値を文字列として保存する代わりに、ネイティブの MongoDB Date を使用する方が理にかなっているのかどうかを検討することもお勧めします (参照)。MongoDb の集計フレームワークを見ると、これらの日付を操作できる関数が多数あることがわかりますが、文字列は非常に限られています。

文字列の並べ替えに関しては、人が並べ替えるというよりも、コンピューターがデータを格納するような並べ替えであると指摘されています。文字列が ASCII/UTF-8 表現として保存されていると考える場合、並べ替えがそのように機能している理由がわかるはずです。

Zoe = [90, 111, 101]
geo = [103, 101, 111]

"geo"指定したとおりに降順でソートすると、の内部バイト表現が文字列のバイト表現よりも大きいことがわかります"Zoe"(この場合103よりも高いソートを使用90)。

通常、MongoDb を使用する場合、大文字と小文字が混在する文字列を並べ替える必要がある場合は、文字列を 2 回保存することをお勧めします。

  1. 元の文字列 ( "Title")
  2. 正規化された文字列として。たとえば、すべて「小文字」として、アクセント付きの文字も一般的な文字に変換される可能性があります。"SortedTitle"したがって、たとえば、という名前の新しいフィールドになり、コードはそれを使用して並べ替えますが、実際の "Title"をユーザーに表示します。
于 2013-11-08T12:14:54.517 に答える
0

ror と mongomapper で実行している場合は、以下の手順に従います。

モデル名 abc を取得し、タイトルの結果を取得しました。

@test_abc_details_array_full=Abc.collection.aggregate([

     {"$project"=> {
       "Title"=> 1,        
       "output"=> { "$toLower"=> "$Title" }       
    }},
    { "$sort"=> {  "output"=>1 } },        
    {"$project"=> {Title: 1, _id:0}},

  ]); 
于 2015-03-19T13:06:19.553 に答える