2011-12-28 36 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}]})