我在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不同,我不知道是否有办法避免这种情况并将汽车与汽车相同
答案 0 :(得分:6)
我刚刚看到这个问题而且我知道它已被回答,但为了将来的参考,有一个“$ downcase”;它被称为$toLower
http://docs.mongodb.org/manual/reference/aggregation/toLower/#exp._S_toLower
db.c.aggregate([
{$group:{_id:{$toLower:'$title'}}}
]);
但是存在一个问题,在实现不区分大小写的索引之前,不能通过大小写区分搜索:https://jira.mongodb.org/browse/SERVER-90。这意味着您目前必须按照不区分大小写的正则表达式进行搜索。
答案 1 :(得分:2)
对于MongoDB的聚合框架中的“$ downcase”运算符来说,这是一个很好的例子;然而,在这个时候,它不存在。
您可以做的最好的事情是为每个文档存储一个可搜索的,下载的标题版本。因此,您的架构看起来像:
{
title: "War and Peace",
searchable_title: "war and peace"
}
在查询可搜索的标题之前,您的查询逻辑会使值变为低位。为了扩展,远离不区分大小写的正则表达式,并使用低级标题。