2012-05-09 4 views
2

Я хотел бы знать, как настроить базу данных для пользовательской сортировки последовательностипользовательского порядок сортировки - конфигурации в MongoDB

Сегодня, MongoDB сортирует данные строки в следующем порядке: (используются шаблон для сортировки списка строк - > [Символы] [0-9] [AZ] [az])

Пример: Текущий отсортированный заказ будет таким.

  1. имя &%
  2. 123AppName
  3. AppName
  4. SentinnelName
  5. appsname
  6. sampleName

Но Мы хотим, чтобы этот вид был другим. Шаблон может быть-> [Символы] [0-9] [Aa-Zz]

Пример: Ожидаемая упорядоченном должно быть, как это

  1. имя &%
  2. 123AppName
  3. AppName
  4. appsname
  5. SentinnelName
  6. sampleNam е

И мой вопрос, есть ли у вас какие-либо идеи о том, как настроить в MongoDB, чтобы настроить шаблон регулярного выражения, для сортировки в нашем ожидаемом порядке. ?

Надеюсь, что это ясно, если что-то неясно, пожалуйста, дайте мне знать, чтобы объяснить более подробно.

PS: Я хочу сделать это изменение на уровне DB, чтобы он сохранял то же самое для любых строк, когда я делаю сортировку по нему.

ответ

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 кодировке

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" } 
+1

Хорошо. Но требует больше работы и внимания :) –

3

В настоящее время MongoDB еще не реализует сортировку. Реализация Unicode collation standard - это способ решения этого вопроса, но, как вы можете видеть, просто просматривая этот документ, это не будет простой задачей. Кроме того, это приведет к замедлению сортировки и увеличению индексов. Поэтому на данный момент лучше всего сортировать в своем приложении или добавить поле с предлагаемыми значениями сортировки - если вы достаточно сумасшедшие, вы можете реализовать алгоритм сортировки от TR10 самостоятельно.