2011-12-28 37 views
1

因此,我需要在Rails 3中編寫一些向MongoDB查詢的東西(如果您不知道mongo,我不需要代碼只是一些想法),可以查詢數據以獲得近似匹配。例如,讓我們假設您正在搜索{item:a,item2:b,item3:c}的集合。完全匹配會有三個,但我也想要匹配,省略三個鍵之一。我有兩個關於如何處理這個問題的理論。一個是做多個查詢來省略某些部分的數據,另一個則是編寫一個複雜或者說明。我不覺得這些是最好的解決方案。其他人可以向我提出一些建議嗎?即使從SQL的角度來看,這對我也很有用。查詢MongoDB和Rails中的近似匹配3

我確實需要一些可以快速完成的工作。這是用於需要儘快返回結果的搜索。

回答

1

另一種方法是使用MapReduce。

有了它,您可以計算文檔匹配的字段數。

雖然目前不是非常高效的方法(但最靈活的方法之一)。

的代碼可以是這樣的:

var m = function() { 
    var fieldsToMatch = {item: a, item2: b, item3: c}; 
    for(var k in fieldsToMatch) { 
    if(this[k] == fieldsToMatch[k]) { 
     emit(this.id, {count : 1}); // emit 1 for each field matched 
    } 
    } 
}; 

var r = function(k, vals) { 
    var result = {count: 0}; 
    vals.forEach(function(v) { 
    result.count += v.count; 
    }); 
    return result; 
} 

db.items.mapReduce(m, r, {out: 'out_collection'}); 
+0

這是一個很好的解決方案。我感謝你,但我確實需要一些非常有效的東西。 – Red 2011-12-28 17:47:19

0

你爲什麼不只是使用mongodb OR,在紅寶石(使用mongoid),你可以做到這一點通過

Collection.any_of({:item => a, :item2 => b, item3 => c},{:item => a, :item2 => b},{:item => a, :item3 => c},{:item2 => b, item3 => c}) 

這相當於

db.Collection.find({$or:[{item:a,item2:b,item3:c}],[{item:a,item2:b}],[{item:a,item3:c}],[{item2:b,item3:c}]})