我如何按指定字段对MongoDB集合进行不区分大小写的排序?默认情况下,我会得到先A-Z后a-z的排序。
我如何按指定字段对MongoDB集合进行不区分大小写的排序?默认情况下,我会得到先A-Z后a-z的排序。
更新: 截至目前,MongoDB已经具备不区分大小写的索引功能:
Users.find({})
.collation({locale: "en" })
.sort({name: 1})
.exec()
.then(...)
Shell:
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,相关任务已经被推迟。
这意味着当前唯一能进行不区分大小写排序的方法是创建一个特定的“小写化”字段,将需要排序的字段值复制为其小写形式,并在该字段上进行排序。
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"
}
当转换后的任何值导致相同的键时,实际插入顺序将保持不变。
这在 MongoDB JIRA 上已经是一个相当长时间的问题,但现在已经得到解决。请查看此版本说明以获取详细文档。您应该使用collation
。
User.find()
.collation({locale: "en" }) //or whatever collation you want
.sort({name:1})
.exec(function(err, users) {
// use your case insensitive sorted results
});
添加代码 .collation({'locale':'en'})
帮助解决了我的问题。
目前(mongodb 4)可以执行以下操作:
mongo shell:
db.getCollection('users')
.find({})
.collation({'locale':'en'})
.sort({'firstName':1});
mongoose:
Users.find({})
.collation({locale: "en" })
.sort({name: 1})
.exec()
.then(...)
请参考 mongodb官方文档。
Customer.find()
.collation({locale: "en" })
.sort({comapany: 1})
这是Java版本的。为了增加多样性,我混合使用了不带参数和第一个键值变量的BasicDBObject
DBCollection coll = db.getCollection("foo");
List<DBObject> pipe = new ArrayList<DBObject>();
DBObject prjflds = new BasicDBObject();
prjflds.put("field", 1);
prjflds.put("insensitive", new BasicDBObject("$toLower", "$field"));
DBObject project = new BasicDBObject();
project.put("$project", prjflds);
pipe.add(project);
DBObject sort = new BasicDBObject();
sort.put("$sort", new BasicDBObject("insensitive", 1));
pipe.add(sort);
AggregationOutput agg = coll.aggregate(pipe);
for (DBObject result : agg.results()) {
System.out.println(result);
}
document: "$$ROOT"
。db.collection.aggregate([
{
$project: {
field: 1,
insensitive: { $toLower: "$field" },
document: "$$ROOT"
}
},
{ $sort: { insensitive: 1 } }
]).toArray()
$addFields
,您不再需要添加 $$ROOT
。 - am.rezdb.collection.aggregate([
{ "$project": {
"field": 1,
"insensitive": { "$toLower": "$field" }
}},
{ "$sort": { "insensitive": 1 } } ])
聚合查询将字段转换为小写,因此对于大数据性能较低。
答案2:
db.collection.find({}).collation({locale: "en"}).sort({"name":1})
默认情况下,MongoDB 遵循 utf-8 编码规则(Z 的优先级高于 a),因此需要使用特定语言的规则进行覆盖。 相比上述查询,它更快速。 请查看官方文档以自定义规则。
MongoDB与优雅提供
public <T extends Entity> ReactivePanacheQuery<T> withCollation(Collation collation);
ReactivePanacheQuery
类中的方法。
使用此方法可以实现对数据进行不区分大小写的排序,具体操作如下。
repo.find(query, sort).withCollation(Collation.builder().locale("en").build())