2016-02-28 69 views
0

我MongoDB中数据的收集,我想给最佳匹配建议,而在我们的建议箱用户输入查询,排序最佳匹配的MongoDB

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

  • 计算机
  • 计算机科学
  • 更多的东西一样

我在节点通过获得来自蒙戈所有匹配的数据,然后再给出一个等级给每个数据

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引擎处理排序,并给我有限的最佳匹配结果。

回答

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'}}); 
+0

嗨,感谢您的支持。 它给我未定义的结果。我不认为var'q'可以在'mapFn'函数 –

+0

@MdAdil中访问,对于以前的错误感到抱歉,您可以定义'q ='com'',就像我在答案中显示的一样。 – zangw

+0

@MdAdil,我没有测试以上巨大的数据,它可能是一个选项或方向为您解决您的问题... – zangw