2016-02-28 102 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