我有一个包含以下文档的集合:
{
"_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包含基于DateTime和分片B的最新文档,以包含超过48小时的文档。
MongoDB有可能吗?或者是否有更好的分片组合,我可以选择,如lat / lng?或者分片键是否应该跟随索引键?
答案 0 :(得分:0)
我认为最简单的方法是使用tag aware sharding,除了链接的文档之外,还有很好的标记识别分片写入found here。你会有一个标记为&#34的碎片(或一组碎片);短期" (或任何有意义的东西),然后标记为"长期"的另一个碎片(或一组碎片)。
选择一个分片键,您可以根据时间识别范围,然后将所有新数据标记为"短期"。现在,您所要做的就是定期更改较旧范围的标记,以将其移至"长期"。
平衡器会将块移动到适当的标签作为优先级(唯一更高的优先级是排水碎片),所以只要你能处理这样一个事实:你的"短的时间范围-term"碎片有超过48小时你应该没问题。
这样做的缺点是你会最终得到热身"短期分片上的块用于写入 - 所有对新数据的写入将始终转到单个块 - 最大块(对于任何单调增加的分片键都是如此)。如果你没关系,并且可以在一个分片上处理你的新数据写入量,那么你应该没问题。
请注意,您不必使用dateTime字段(请记住您的分片键是不可变的),您也可以在_id字段中使用ObjectID,因为它也包含基于时间的值 - 有关详细信息,请参阅我的相关Q&A here。