MongoDB大小写不敏感排序

12

我在使用nodejs(express)和mongodb作为数据库的一个项目中,非常努力地进行着结构化工作。当我使用sort()获取所有数据时,它以错误的方式返回数据,那么有没有办法让它按照我期望的格式正确地返回呢?

如果我们在数据库中有三条记录:

---------------------
id  | Name |  aga
---------------------
1   | atul | 21
---------------------
2   | Bhavik | 22
---------------------
3   | Jay | 25

我目前得到的是:

2,3,1 系列数据

我期望得到的是:

1,2,3

这意味着在排序时忽略大小写,是否可能不添加新列。


你尝试过使用 sort({name:1}) 或者将 -1 替换为你需要的输出吗? - Saikat Chakrabortty
当我们有更多的记录时,这将无法工作,因为mongodb首先按大写字母排序,然后是第二个字母,这意味着它不检查大小写。 - Rushabh Madhu
3个回答

24

您需要在此处使用 collation 并设置 locale: "en"

db.collection.find({}).collation({ locale: "en" }).sort({ name: 1 })
所以针对下面的文件
{ "_id" : 1, "name" : "Bhavik" }
{ "_id" : 2, "name" : "Jay" }
{ "_id" : 3, "name" : "atul" }

你将获得

{ "_id" : 3, "name" : "atul" }
{ "_id" : 1, "name" : "Bhavik" }
{ "_id" : 2, "name" : "Jay" }

其实我也需要在同一个查询上使用populate,这是可能的吗? 以下是我正在使用的实际代码:(我已经尝试过使用collection,但它会出现错误)让属性=等待Property.find({'status':{$in:status}}).populate({path: 'user', model: 'User',select: 'first_name last_name mail contact_number'}).populate({path: 'category', model: 'Category',select: 'category_name id'}).sort(sortClause).skip(skip).limit(perpage).exec(); - Rushabh Madhu
出现错误:UnhandledPromiseRejectionWarning: MongoError: server 192.168.137.152:27017 不支持校对。我的操作系统:Linux Ubuntu17。 - Rushabh Madhu
Mongoose和MongoDB的版本? - Ashh
Mongoose 5.4和mongo --version的输出如下:db版本v3.2.20 git版本:a7a144f40b70bfe290906eb33ff2714933544af8 OpenSSL版本:OpenSSL 1.0.2g 1 Mar 2016 分配器:tcmalloc 模块:无 构建环境: distmod:ubuntu1604 distarch:x86_64 target_arch:x86_64 - Rushabh Madhu
你需要将MongoDB版本更新至3.4或以上才能使用排序功能。 - Ashh

1
通过这种方式使用默认排序创建集合,您可以按任何属性进行不区分大小写的排序。
db.createCollection("collection_name", { 
    collation: { 
        locale: 'en_US', strength: 2 
    } 
})

db.getCollection('collection_name')
    .find({})
    .sort( { 'property_name': -1 } )

更多信息:https://docs.mongodb.com/manual/core/index-case-insensitive/


0

您可以直接在find方法的options参数中传递collation: { locale: 'en' }

db.collection.find({ ...query }, {
  sort: ...,
  limit: ...,
  collation: { locale: 'en' }
}

这是针对node-mongodb native驱动程序的。但不适用于mongoose。**:-)** - Ashh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接