按最佳匹配mongodb排序

时间:2016-02-28 12:11:48

标签: mongodb sorting

我在Mongodb中有数据集合,我想在我们的建议框中提供用户输入查询时提供最佳匹配建议,

当用户开始输入com建议时应该是:

  • 计算机
  • 计算机科学
  • 更相似的东西

我在Node中排序,先从mongo获取所有匹配的数据然后给每个数据排序

function rank(name, q) {
    var len = name.length,
        lastIndex = -1;
    for(var i = 0; i < q.length; i++) {
        var n = name.indexOf(q[i], (lastIndex + 1));
        if(n !== -1) {
            len--;
            lastIndex = n;
        }
    }
    return len;
}
var query = 'com';
// giving rank to data
data = data.map(function(v) {
    v.rank = rank(v.value, query);
   return v;
});
// sorting by rank
data = data.sort(function(a, b) {
    return a.rank - b.rank
});

它给了我满意的结果,但在处理大数据时会太慢。 我想让mongodb引擎处理排序,并给我有限的最佳匹配结果。

1 个答案:

答案 0 :(得分:0)

也许你可以通过mapreduce来做到这一点。 Map-reduce是一种数据处理范例,用于将大量数据压缩为有用的聚合结果。

var mapFn = function(){
    var len = this.name.length,
        lastIndex = -1;
    var q = 'com';
    for(var i = 0; i < q.length; i++) {
        var n = this.name.indexOf(q[i], (lastIndex + 1));
        if(n !== -1) {
            len--;
            lastIndex = n;
        }
    }
  emit(len, this);
};

var reduceFn = function(key, values){
  return values.sort(function(a,b){
    return a.name - b.name;
  });
};

db.collection.mapReduce(mapFn, reduceFn, { out: { reduce: 'result_collection'}});
相关问题