自定义排序顺序 - mongoDB中的配置

时间:2012-05-09 08:57:17

标签: sorting mongodb configuration

我想知道如何配置数据库以进行自定义排序序列

今天,MongoDB按以下顺序对字符串数据进行排序:(使用模式对字符串列表进行排序是 - > [符号] [0-9] [A-Z] [a-z])

示例:当前排序顺序将是这样的。

  1. &安培;%名称
  2. 123AppName
  3. AppName的
  4. SentinnelName
  5. appsname
  6. sampleName
  7. 但我们想要这种方式的方式是不同的。图案可以是 - > [符号] [0-9] [AA-ZZ]

    示例:预期的排序顺序应该是这样的

    1. &安培;%名称
    2. 123AppName
    3. AppName的
    4. appsname
    5. SentinnelName
    6. sampleName
    7. 我的问题是,您是否知道如何在mongoDB中配置以自定义正则表达式模式,以按预期顺序排序。 ?

      我希望很明显,如果不清楚,请让我知道更详细的解释。

      PS:我想在数据库级别进行此更改,以便在对其进行排序时对任何字符串保持相同。

3 个答案:

答案 0 :(得分:3)

目前,MongoDB尚未实施排序规则。实现Unicode collation standard是解决这个问题的最佳方式,但正如您在浏览该文档时所看到的那样,这不是一项简单的任务。此外,它会使排序更慢,索引更大。所以现在,最好在你的应用程序中进行排序,或者添加一个包含你建议的排序值的字段 - 如果你疯了,你可以自己实现TR10的排序算法。

答案 1 :(得分: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编码

答案 2 :(得分:1)

为什么不添加一个默认按您想要的顺序排序的密钥。 e.g。

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