2014-05-02 102 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