不同的Node.js MongoDB不区分大小写情况

6

我在Mongo中使用distinct来返回一些Jquery Autocomplete中的值,代码如下:

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和Car是不同的。我不知道是否有办法避免这种情况并将Car视为与car相同。

2个回答

7

我刚刚看到这个问题,虽然已有答案,但是以后参考时要知道,有一个"$downcase", 它被称为$toLowerhttp://docs.mongodb.org/manual/reference/aggregation/toLower/#exp._S_toLower

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

然而,存在一个问题,即在实现不区分大小写的索引之前,您无法进行不区分大小写的搜索:https://jira.mongodb.org/browse/SERVER-90。这意味着目前您必须像当前一样使用不区分大小写的正则表达式进行搜索。


2

这是在MongoDB聚合框架中使用"$downcase"运算符的绝佳案例,但目前还不存在该运算符。

你能做的最好的事情就是为每个文档存储一个可搜索的小写标题版本。因此,你的模式应该如下所示:

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

您的查询逻辑会在查询可搜索标题之前对值进行小写处理。为了扩展,请避免使用不区分大小写的正则表达式,采用小写标题。

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