2013-04-21 39 views
17

隨着2.3 >的推出,MongoDB在位置數據處理和查詢方面變得更加有用。 MongoDB將文檔存儲爲BSON,因此每個文檔都具有所有文檔字段,這顯然可能導致比我們的傳統RMDBS更大的數據庫。GeoJSON和MongoDB:將點存儲爲GeoJSON.Point是否值得?

我曾經將多段線和多邊形存儲爲一系列索引點,並使用一個額外的字段來表示每行的順序(爲了確保一致性,我使用JavaScript,因此點並不總是存儲在其中正確的順序)。它是這樣的:

polyline: { 
    [ 
    point: [0,0], 
    order: 0 
    ], 
    [ 
    point: [0,1], 
    order: 1 
    ] 
} 

而現在我使用:

polyline: { 
    type: 'LineString', 
    coordinates: [ 
    [0,0], 
    [1,0] 
    ] 
} 

我見過的改善的文件大小,因爲有些多義線最多可以有500點。

但是,我想知道將我的所有Point數據存儲爲GeoJSON的好處是什麼。我在文件大小增加氣餒,例如:

loc: [1,0] 

是更好的方式比

loc: { 
    type: 'Point', 
    coordinates: [0,1] 
} 

,因而會更容易的工作。

我的問題是:

是更好/推薦存儲點作爲GeoJSON對象,而不是一個2點陣列?

我所考慮的是以下幾點:

  • 大小限制:我可能有幾百萬的一個位置,這可能會影響集合的大小的文件,並有可能我的口袋裏。
  • 一致性:最好處理lng, lat格式的每一組座標,而不是堅持lat, lng爲點,而前者是我所有其他位置特徵。
  • 便利性:如果我抓住一個點,並使用$geoWithin$geoIntersects,那麼在將它用作參數query之前,我不需要先將它轉換爲GeoJSON。

什麼我不確定的是:

  • 無論loc: [x,y]支持將在未來有關MongoDB被丟棄從2dsphere
  • 任何索引的好處,而不是2d
  • 無論任何計劃GeoJSON對MongoDB的補充可能會導致需要上述的一致性。

我寧願移動到GeoJSON,而我的數據仍然可以管理,而不是在將來會在很大的壓力下切換。

請允許我請一個徹底的(即使有點)想出來的答案。我不會很快選擇正確的答案,所以我可以評估任何迴應

我也不確定SO是否是提出問題的正確位置,所以如果DBA是更合適的地方,我會在那裏提出問題。我選擇了SO,因爲這裏有很多與MongoDB相關的活動

回答

17

我會推薦使用新的GeoJSON格式。雖然我不相信已經宣佈放棄對舊格式的支持,但他們稱之爲遺產的事實應該表明他們的意見。

使用2dsphere而不是2d有一些索引優點。

  • 首先它實際上是基於地球是一個球體計算查詢。 2d索引的一個缺點是它不能解釋這個意思,如果你對查詢覆蓋的實際區域感興趣,而不是基本的經緯度,你將不得不自己處理這個轉換。
  • 使用複合索引的能力,如果你想做一些類似於「讓我從這個區域獲得100個最近的結果」,那麼2dsphere是你唯一的選擇。
  • 使用geoIntersects查詢的能力。
  • geoWithin幾何查詢要求您使用geoJSON格式。

另一個需要注意的重要事項是,您需要確保您使用的查詢是由您使用的索引支持的。例如,如果您使用2dsphere,則不能使用$ box查詢,因爲它不會被索引 - 但mongo不會警告您 - 結果只會執行表掃描,並且會非常慢!

Mongo provide a compatibility chart of which queries can be used with which index

+0

我接受你的答案。你的第二點是讓我信服的那一點。我已經閱讀了它,但忘記了我現在可以在2dsphere上使用複合索引 – 2013-06-01 15:35:28

3

是的,我認爲這是值得的。根據我對地理空間信息系統的經驗,最好將您的位置數據存儲在一個有用且可轉換的標準中。 MongoDB中的GeoJSON支持WGS84數據標準。

在MongoDB中,$near運算符可以搜索遺留2d座標和GeoJSON座標。在傳統2D座標集合上,$ near會返回最接近的第一個已排序集合。 $geoNear返回距離搜索點元數據最近的第一個排序後的集合。

另一個好處是可以使用其他空間查詢(即$ geoWithin和$ geoIntersect)特別是如果你存儲其他GeoJSON的類型(折線,多邊形)

最後While basic queries using spherical distance are supported by the 2d index, consider moving to a 2dsphere index if your data is primarily longitude and latitude.

我希望的能力這些信息爲您提供一些關於如何處理您的位置數據的思考點。

+0

從我迄今爲止的經驗來看,我可以將Mongo的所有geoqueries與傳統對一起使用,包括'$ geoNear'。所以我沒有注意到查詢類型的差異。我還有另一個使用GeoJSON來處理所有位置數據的應用程序,所以我在談論兩者之間的比較。 我以lat,lng格式存儲點數據,並且編寫了一個從'GeoJSON'轉換爲數組並返回的實用程序。所以從方便起,這並沒有什麼不同。我更擔心未來與Mongo 2.6的兼容性等等 – 2013-05-17 07:17:24

2

如果你只存儲點幾何在你的數據庫,但要支持多個不同的GeoJSON的對數據的查詢,則請注意,它可以存儲點在傳統座標對格式使用2dsphere索引。

release notes爲貓鼬的GeoJSON的支持(MongoDB的> = 2.4)得到下面的例子:座標上遺留

2dsphere索引對:

對遺留
new Schema({ 
    loc: { type: [Number], index: '2dsphere'} 
}); 

GeoJSON查詢座標使用2dsphere索引:

var geojsonPoly = { 
    type: 'Polygon', 
    coordinates: [[[-5,-5], ['-5',5], [5,5], [5,-5],[-5,'-5']]] 
}; 

Model.find({ loc: { $within: { $geometry: geojsonPoly }}}); 
相關問題