MongoDB 中不区分大小写的排序

2022-08-31 12:49:40

如何按给定字段对 MongoDB 集合进行排序,不区分大小写?默认情况下,我在 a-z 之前得到 A-Z。


答案 1

更新:截至目前,mongodb具有不区分大小写的索引:

Users.find({})
  .collation({locale: "en" })
  .sort({name: 1})
  .exec()
  .then(...)

壳:

db.getCollection('users')
  .find({})
  .collation({'locale':'en'})
  .sort({'firstName':1})

更新:这个答案已经过时了,3.4将有不区分大小写的索引。查看JIRA以获取更多信息,https://jira.mongodb.org/browse/SERVER-90


不幸的是,MongoDB还没有不区分大小写的索引:https://jira.mongodb.org/browse/SERVER-90,任务已经推迟了。

这意味着目前对大小写不敏感的唯一方法是实际创建一个特定的“小写”字段,复制相关排序字段的值(当然是小写的),然后对其进行排序。


答案 2

排序在MongoDB中确实像这样工作,但您可以使用聚合动态执行此操作:

取以下数据:

{ "field" : "BBB" }
{ "field" : "aaa" }
{ "field" : "AAA" }

因此,使用以下语句:

db.collection.aggregate([
    { "$project": {
       "field": 1,
       "insensitive": { "$toLower": "$field" }
    }},
    { "$sort": { "insensitive": 1 } }
])

将产生如下结果:

{
    "field" : "aaa",
    "insensitive" : "aaa"
},
{
    "field" : "AAA",
    "insensitive" : "aaa"
},
{
    "field" : "BBB",
    "insensitive" : "bbb"
}

对于转换时产生相同键的任何值,将保持实际的插入顺序。


推荐