2

我想知道如何为自定义排序顺序配置数据库

今天,MongoDB 按以下顺序对 String 数据进行排序:(用于对字符串列表进行排序的模式是 -> [Symbols][0-9][AZ][az] )

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

  1. &%姓名
  2. 123应用程序名称
  3. 应用名称
  4. 哨兵名称
  5. 应用名称
  6. 样品名称

但是我们想要这种方式是不同的。模式可以是-> [符号][0-9][Aa-Zz]

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

  1. &%姓名
  2. 123应用程序名称
  3. 应用名称
  4. 应用名称
  5. 哨兵名称
  6. 样品名称

我的问题是,您是否知道如何在 mongoDB 中配置以自定义正则表达式模式,以按照我们预期的顺序进行排序。?

我希望它很清楚,如果有不清楚的地方,请让我知道以更详细地解释。

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

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 回答