给定一组[2004,2008],找到这个集合是否与其他集合相交的最快方法是什么?
其实我在处理数据库的问题,表有2列,一列是下限,另一列是上限。任务是找到具有给定2元组的所有相交行(如[2004,2008])。
我正在使用mongodb,这本质上是支持的(我的意思是有关键字来做)。 我有庞大的用户群,所以我希望尽快完成这项任务。
编辑:为了更清楚,数据库表包含以下行:
20 30
10 50
60 90
...
给定输入(25 40)
范围,我想返回表示范围的行,与给定范围相交。
所以返回是:(20 30),(10 50)
答案 0 :(得分:4)
我根本不知道MongoDB,但你基本上都在寻找
SELECT * from the_table where not (lower_bound > 2008 or upper_bound < 2004)
。
答案 1 :(得分:3)
尝试此操作,假设low
和high
是您的绑定字段:
db.ranges.find({'low': {'$lt': self.high}, 'high': {'$gt': self.low}})
如果您希望查询具有包容性而非排他性,则替换$lte
和$gte
。
答案 2 :(得分:2)
MongoDB不支持交集。使用集合的intersection()API在Python级别执行交集。
答案 3 :(得分:1)
由于你正在处理下界和上界,你可以检查边界。
def intersects(this, others):
upper, lower = this
return [[u, l] for u, l in others
if (l < upper < u) or (l < lower < u)]
我不知道MongoDB,但如果你能在数据库中实现这个逻辑,我不禁会认为它会更快。
答案 4 :(得分:1)
您可以使用带有Javascript表达式的mongodb查询(假设lowerbounds
和upperbounds
是相交的集合的限制):
f = function() { return this.lower <= upperbounds && this.upper >= lowerbounds; }
db.ranges.find(f);
这应该处理所有情况,包括[this.lower,this.upper]是[lowerbounad,upperbounds]的超集或适当子集时。