2014-03-19 35 views
1

我正在研究一个处理给定球形查找附近文档的小模块。在使用mongoid3我使用以下命令来接收具有给定纬度,经度和球距的文档以查找文档。如何根据距离使用mongoid中的“within_spherical_circle”排序文档

document_klass.within_spherical_circle(geo_attribute: [[77.04363, 28.45842], (20.fdiv(6371))]) 

从给出的latlong给出20公里范围内文件的结果。此外,我可以应用限制和分页,因为这是一个纯粹的mongoid标准。

但是这样做的结果默认情况下不会按排序顺序给出文档。 (也是我找不到within_spherical_circle,它给了我通过距离排序的文件) 我也试过geo_near方法,但它很难做到分页/跳过。有什么建议么?

UPDATE

而且,我试图mongoid 3.1.X geo_near方法

document_class.limit(10).geo_near([77.04363, 28.45842]).distance_multiplier(6371).max_distance(10.fdiv(6371)).spherical 

其假设给我结果的排序顺序和做完全一样的。 MongoDB的

[0.0, 0.013106917278934711, 0.014252314759648424, 0.01842674324658152, 0.02131271009525241, 0.022594202024593005, 0.024637859034323726, 0.02501954892893619, 0.02501954892893619, 0.025071008433970268] 

但这并不没有考虑,页面$跳过事情。

回答

0

我猜在这里,如果你有距离的方法,你可以在你的模型

def distance(object_to_calculate_distance) 
    self.method(object_to_calculate_distance) 
    #method should be the method predefined for distance 
end 

然后使用sort_by订购像

@array_of_items_in_the_circle.sort_by(&:distance) 

希望数组定义是这样的它有助于

+0

啊......是的,我同意你的看法,这就是我现在正在做的事情。 但是,假设我在给定半径有50个文档,并且我使用的是10或20的限制。如果** within_spherical_circle **没有给出排序结果,那么很难确保我得到最接近的10或20个。否则,我不得不请求更大的数据块(50或100)。对它们进行排序并在结果数组上使用限制以获得期望的结果(大约)。任何猜测? – r3bo0t

+0

同样在解决方案中,对于某些特定的圈子,我有更多的密度为100k的文档。因此,在这种特殊情况下,对完整结果集进行距离计算是不可行的。 – r3bo0t

+0

我明白是很多数据,但你不能在排序后应用限制吗?你可以用这个'@ array_of_items_in_the_circle.sort_by(&:distance).take(20)' – Alexis

相关问题