在MongoDB中为基于时间的查询提取一个好的切分密钥

在MongoDB中为基于时间的查询提取一个好的切分密钥,mongodb,sharding,Mongodb,Sharding,我收集了以下文件: { “_id”:ObjectId(“535e194aba863da3118cdf8a”), “设备id”:“1080000008”, “其他”:[ { “里程”:“0.0”, “事件”:“5”, “卫星”:“8”, “高度”:“0”, “标题”:“290” } ], “速度”:68, “lat”:1.3209, “液化天然气”:103.89139, “日期时间”:ISODate(“2014-04-28T17:03:05.000Z”), “输出_状态”:0, “街道名称”:“J

我收集了以下文件:

{
“_id”:ObjectId(“535e194aba863da3118cdf8a”),
“设备id”:“1080000008”,
“其他”:[
{
“里程”:“0.0”,
“事件”:“5”,
“卫星”:“8”,
“高度”:“0”,
“标题”:“290”
}
],
“速度”:68,
“lat”:1.3209,
“液化天然气”:103.89139,
“日期时间”:ISODate(“2014-04-28T17:03:05.000Z”),
“输出_状态”:0,
“街道名称”:“JALAN AFIFI”,
“设备类型”:“VT10”,
“_v”:0
}
我有两个分片,A和B,我希望分片A包含基于日期时间的最新文档,分片B包含超过48小时的文档


在MongoDB有可能吗?或者我可以选择更好的切分组合,比如lat/lng?还是应该在索引键之后使用分片键?

我认为最简单的方法是使用链接文档,除了链接文档之外,还有一个关于标签感知分片的好方法。一个碎片(或一组碎片)被标记为“短期”(或任何有意义的东西),然后另一个碎片(或一组碎片)被标记为“长期”

选择一个分片键,该键允许您根据时间确定范围,然后将所有新数据标记为“短期”。现在,您所要做的就是定期更改旧范围上的标记,将其移动到“长期”

均衡器会将块作为优先级移动到相应的标签上(唯一更高的优先级是消耗碎片),因此只要您能够处理这样一个事实,即您的“短期”碎片有超过48小时的时间范围,您就应该没事了

这样做的缺点是,您最终会在短期碎片上出现“热”块,用于写入-所有新数据的写入都将始终是单个块-最大块(对于任何单调递增的碎片键都是如此)。如果您对此没有问题,并且可以在单个碎片上处理新的数据写入卷,那么您应该不会有问题

请注意,您不必使用dateTime字段(请记住,您的shard键是不可变的),您还可以在_id字段中使用ObjectID,因为它也包含基于时间的值-有关这方面的更多信息,请参阅我的相关内容