2014-05-02 100 views
2

撿了一個良好的碎片鍵基於時間的查詢我有以下文件的集合:MongoDB中

{ 
    "_id" : ObjectId("535e194aba863da3118cdf8a"), 
    "device_id" : "1080000008", 
    "others" : [ 
     { 
      "mileage" : "0.0", 
      "event" : "5", 
      "satellite" : "8", 
      "altitude" : "0", 
      "heading" : "290" 
     } 
    ], 
    "speed" : 68, 
    "lat" : 1.3209, 
    "lng" : 103.89139, 
    "dateTime" : ISODate("2014-04-28T17:03:05.000Z"), 
    "output_status" : 0, 
    "street_name" : "JALAN AFIFI", 
    "device_type" : "VT10", 
    "__v" : 0 
} 

我有2個碎片,A和B,我想碎片A到包含最新的文件基於日期時間和分片B包含晚於48小時的文檔。

在MongoDB中可能嗎?或者我可以選擇更好的分片組合,比如lat/lng?或者分片鍵是否應該跟隨索引鍵?

回答

0

我認爲最簡單的方法是使用tag aware sharding,除了鏈接的文檔之外,還有一個關於標籤感知分片的精彩文章是found here。你將有一個被標記爲「短期」(或任何有意義的)的碎片(或一組碎片),然後是被標記爲「長期」的另一個碎片(或一組碎片)。

選擇一個分片鍵,它允許您根據時間確定範圍,然後將所有新數據標記爲「短期」。現在,您所要做的就是定期更改舊範圍上的標籤,將其移至「長期」範圍。

平衡器會優先將塊移動到合適的標籤(唯一更高的優先級是排水片),只要您能處理這樣一個事實,即您的「短期「碎片超過48小時,你應該沒事。

這樣做的不利之處在於,您最終會在短期碎片中寫入「熱」塊 - 寫入新數據的所有寫入操作都將一直到單個塊 - 最大塊(這對於任何單調遞增的分片鍵)。如果你沒有問題,並且可以在一個碎片上處理新的數據寫入量,那麼你應該沒問題。

請注意,您不必使用dateTime字段(記住您的分片鍵是不可變的),您還可以在_id字段中使用ObjectID,因爲它也包含基於時間的值 - 有關該信息的更多信息,請參閱我的相關Q&A here