Mongo DBsorting不区分大小写

我想从mongodb中得到一个分类的名字。我通过下面的方法完成了这个

query.sort().on("name", Order.ASCENDING) 

与此查询执行,我能够findsorting的结果,区分大小写。 但我只是想获得结果的情况下忽略的forms。 怎么做? 请引导我通过这个。

我正在研究Java代码。 所以请用适当的方法给我build议。

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


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

这意味着目前sorting不区分大小写的唯一方法是实际创build一个特定的“下方”字段,复制有问题的sorting字段的值(当然是下方),然后对其进行sorting。

sorting在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:'asc'}) .exec(function(err, users) { // use your case insensitive sorted results }); 

这是在Java中。 我混合了无参数和BasicDBObject第一个key-val变体,以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); } 

我们用JavaScript数组中的.sort函数来解决这个问题

这是代码


    函数foo(){
       let results = collections.find({
         _id:_id
       },{
        字段:{
           '用户名':1,
         }
       })。取();

       results.sort((a,b)=> {
         var nameA = a.username.toUpperCase();
         var nameB = b.username.toUpperCase();

         if(nameA nameB){
          返回1;
         }
        返回0;
       });

      返回结果;
     }