2017-05-06 90 views
0

我們有一個問題,在mongodb數據庫中用距離找到用戶點附近的點。我們的主要問題是我們無法用近距離聚集近點。我們使用$ geoWithin下面查詢:Mongodb在用戶點附近找到點距離

db.users.find({位置:{$ geoWithin: {$ centerSphere:[[51.410608,35.744042],2/6378.1]}}})。排序( {「user.lastActivity」: - 1})。limit(100)

此查詢在0.005秒內從500204條記錄返回100條記錄。

我們也使用$ nearSphere下面的查詢:

db.users.find({位置:{$ nearSphere:{$幾何:{類型: 「點」, 座標:51.410608,35.744042 ]},$ maxDistance:2000}}} )排序({ 「user.lastActivity」: - 1})限制(100)

該查詢返回從500204個記錄在8.486秒100分的記錄。

我們還使用geoNear下面查詢:

db.runCommand({geoNear: 「用戶」, 鄰近:{類型: 「點」,座標:[51.410608,35.744042]}, 球形:true, 「limit」:100,「maxDistance」:2000})

此查詢在6.215秒內從500204條記錄返回100條記錄。這個查詢發現距離近點但執行需要很長時間。

我們在users.locations字段中添加索引2dsphere。

1)請說出爲什麼$ nearSphere執行時間超過$ nearSphere? 2)如何用$ nearSphere找到近點並計算回報記錄的距離? 3)如何用更少的時間執行geoNear?

我們也在1394018記錄上找到與mysql的近點。執行時間是0.0011。這一次真的太棒了。

SELECT st_distance_sphere(fld_geom,點(35.744042,51.410608)),如從testgeom 距離其中st_distance_sphere(fld_geom,點( 35.744042,51.410608))< = 2000 LIMIT 100

我想的MySQL空間比mongodb空間非常強大。

回答

0

要提高性能,請在搜索字段上爲集合創建2D球體索引。

https://docs.mongodb.com/manual/core/2dsphere/#create-a-2dsphere-index

還有其他類型的地理空間指標的爲好。這應該大大提高內存利用率的性能。

+0

感謝。我們將添加2dsphere索引,但問題沒有解決。性能不佳。 –

+0

然後考慮在不同的集合中保留不相關的數據,或者查看您的服務器規格。 – arboreal84

+0

感謝您的解決方案。我們可以在mysql上運行這個部分,但是我們不能這樣做。 mysql對於這個操作確實有不錯的表現。 –

0

$ nearSphere會給出按距離排序的結果,而$ getWithin則不會。 我不認爲SQL查詢按照距離的文件(只是過濾它們像$ geoWithin)

  • 無厘頭使用排序上user.lastActivity與$ nearSphere - 你只覆蓋從你的距離排序$ nearSphere。

documentation