2

カスタムソートシーケンス用に DB を構成する方法を知りたい

現在、MongoDB は次の順序で文字列データを並べ替えます: (文字列のリストを並べ替えるために使用されるパターンは -> [Symbols][0-9][AZ][az] です)

例:現在のソート順はこのようになります。

  1. &%名前
  2. 123アプリ名
  3. アプリ名
  4. SentinnelName
  5. アプリ名
  6. サンプル名

しかし、私たちがこの種を望む方法は異なります。パターンは次のとおりです-> [シンボル][0-9][Aa-Zz]

例: 予想される並べ替え順序は次のようになります

  1. &%名前
  2. 123アプリ名
  3. アプリ名
  4. アプリ名
  5. SentinnelName
  6. サンプル名

私の質問は、mongoDB で正規表現パターンをカスタマイズし、予想される順序でソートするように構成する方法を知っていますか。?

明確であることを願っています。不明な点がある場合は、詳細を説明するためにお知らせください。

PS: この変更を DB レベルで行いたいので、並べ替えを行ったときにどの文字列でも同じになるようにします。

4

3 に答える 3

3

現在、MongoDB はまだ照合を実装していません。これを解決するには、 Unicode 照合標準を実装するのが最善の方法ですが、そのドキュメントをざっと見ただけでわかるように、簡単な作業にはなりません。また、ソートが遅くなり、インデックスが大きくなります。したがって、今のところは、アプリケーションで並べ替えるか、提案された並べ替え値を含むフィールドを追加するのが最善です。もし気が狂っているなら、TR10 の並べ替えアルゴリズムを自分で実装できます。

于 2012-05-09T10:12:02.387 に答える
1

デフォルトで希望の順序でソートされるキーを追加してみませんか。例えば

> db.foo.insert({name: "&%name"})
> db.foo.insert({name: "123AppName"})
> db.foo.insert({name: "AppName"})
> db.foo.insert({name: "appsname"})
> db.foo.insert({name: "SentinnelName"})
> db.foo.insert({name: "sampleName"})

> db.foo.find().forEach(function(row) { db.foo.update({_id: row._id}, {$set: {sname: row.name.toLowerCase()}}); });

> db.foo.find()> db.foo.find({}, {name: 1}).sort({sname: 1})
{ "_id" : ObjectId("4faa32e2a1454519983b116e"), "name" : "&%name" }
{ "_id" : ObjectId("4faa32e8a1454519983b116f"), "name" : "123AppName" }
{ "_id" : ObjectId("4faa330ba1454519983b1170"), "name" : "AppName" }
{ "_id" : ObjectId("4faa3310a1454519983b1171"), "name" : "appsname" }
{ "_id" : ObjectId("4faa331aa1454519983b1173"), "name" : "sampleName" }
{ "_id" : ObjectId("4faa3315a1454519983b1172"), "name" : "SentinnelName" }
于 2012-05-09T09:11:35.713 に答える
1

MongoDB は正規表現を使用して文字列を並べ替えません。それらを辞書順に並べ替えます。"%" < "0"、"0" < "A"、および "A" < "a" (文字コードに基づく) はたまたま発生します。

ただし、「@」は辞書編集上*数字と大文字の間にあります。そして、それはそのようにソートされます。

% mongo
MongoDB shell version: 2.1.0
connecting to: test
> db.sort.insert({s: '777'})
> db.sort.insert({s: 'AAA'})
> db.sort.insert({s: '@@@'})

> db.sort.find().sort({s: 1})
{ "_id" : ObjectId("4faa33a07758e53f27a9896a"), "s" : "777" }
{ "_id" : ObjectId("4faa33b67758e53f27a9896c"), "s" : "@@@" }
{ "_id" : ObjectId("4faa33ad7758e53f27a9896b"), "s" : "AAA" }

そのため、MongoDB の動作を変更する方法がまったくわかりません。代わりにアプリケーションでソートする必要があります。

* ASCII または UTF-8 エンコーディングを想定

于 2012-05-09T09:09:01.160 に答える