2013-08-20 64 views
3

我在蒙戈使用不同在jQuery的自动完成返回一些价值观是这样的:区分节点JS的MongoDB不区分大小写

function Reg(title) 
    { 
     this.title= title; 
    } 

exports.find = function(req, res) { 
var b=req.params.search; 
var query = new Array(); 
var cadsrch = b.split(' '); 
var l = cadsrch.length; 
var i = 0; 
     for (i = 0; i < l; i++) { 
      if(cadsrch[i]!=''){ 
       query[i]=new RegExp('^'+cadsrch[i], 'i'); 
      } 
     } 

var data=new Array(); 
     db.collection('publication', function(err, collection) { 
       collection.distinct('title',{content:{'$all':query}},{'$or':[{type:'an'},{type:'pub'}]}, 
        function(err, items) { 
         var l=items.length,i=0; 
         for (i=0;i<l;i++){ 
          data[i]=new Reg(items[i]); 
         } 
         res.jsonp(data); 
         } 
       ) 
     }); 
}; 

的问题是,列“标题”工作在大小写敏感的,我的意思是例如汽车与Car不同,我不知道是否有办法避免这种情况,并采取与汽车相同的方式

回答

2

这是MongoDB聚合框架中“$ downcase”运算符的一个绝妙例子;但目前尚不存在。

您可以做的最好的做法是为每个文档存储一个可搜索的,标题较低的版本。因此,您的架构看起来像:

{ 
    title: "War and Peace", 
    searchable_title: "war and peace" 
} 

您的查询逻辑将downcase值查询搜索的标题之前。对于缩放,请远离大小写不敏感的正规表达式,并使用缩小的标题。

5

我刚刚看到这个问题,但我知道它已被回答,但为了将来的参考,有和是,“$ downcase”;它被称为$toLowerhttp://docs.mongodb.org/manual/reference/aggregation/toLower/#exp._S_toLower

db.c.aggregate([ 
    {$group:{_id:{$toLower:'$title'}}} 
]); 

有一个问题,虽然,你无法通过的情况下insenstive搜索直到有大小写不敏感指标实现:https://jira.mongodb.org/browse/SERVER-90。这意味着你现在必须像现在这样通过不区分大小写的正则表达式来处理。