我正在研究的MongoDB收集程序从手机上获取传感器数据,然后每隔2-6秒向服务器发送一次pinged命令。
数据量很大,4-5个小时就超过了16mb的限制,似乎没有解决这个问题的办法?
我试着在Stack Overflow上搜索它,并经历了各种问题,但实际上没有人分享他们的技巧。
有没有办法..。在DB端,可能会像通过gridFS分发大文件一样分发数据块?
发布于 2016-10-21 21:33:15
为了解决这个问题,你需要对你的数据结构做一些小的修改。听起来,要想让您的文档超过16mb的限制,您必须将传感器数据嵌入到单个文档的数组中。
我不建议在这里使用GridFS,我不认为它是最好的解决方案,原因如下。
你可以使用一种称为bucketing的技术,它基本上会将你的传感器读数分割成单独的文档,为你解决这个问题。
它的工作方式是:
假设我有一个文档,其中包含特定传感器的一些嵌入式读数,如下所示:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
]
}使用上面的结构,已经有了一个主要的缺陷,读数数组可能会呈指数级增长,并超过16mb的文档限制。
所以我们能做的就是稍微改变一下结构,使其看起来像这样,包括一个count属性:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
],
count : 3
}这背后的想法是,当您将读数写入嵌入式数组时,每次执行推送时,您都会递增($inc) $push变量。当您执行此更新(推送)操作时,您将在此"count“属性上包含一个过滤器,它可能如下所示:
{ count : { $lt : 500} }然后,设置您的更新选项,以便您可以将"upsert“设置为"true":
db.sensorReadings.update(
{ name: "SensorName1", count { $lt : 500} },
{
//Your update. $push your reading and $inc your count
$push: { readings: [ReadingDocumentToPush] },
$inc: { count: 1 }
},
{ upsert: true }
)有关MongoDb更新和向上插入选项的更多信息,请参见此处:
将发生的情况是,当不满足过滤条件时(即此传感器没有现有文档,或者计数大于或等于500 -因为每次推入项目时都会递增计数),将创建一个新文档,读数现在将嵌入到此新文档中。所以,如果你这样做得当,你永远不会达到16mb的限制。
现在,在数据库中查询特定传感器的读数时,您可能会得到该传感器的多个文档(而不是只有一个包含所有读数的文档),例如,如果您有10,000个读数,则会返回20个文档,每个文档都有500个读数。
然后,您可以使用聚合管道和$unwind来过滤您的读数,就像它们是它们自己的单独文档一样。
有关展开的更多信息,请参阅此处,它非常有用
我希望这能帮到你。
发布于 2016-10-21 19:33:12
您可以在MongoDB中使用GridFS来处理这种情况。
而不是将文件存储在单个文档中,GridFS将文件分成多个部分,或分块1,并将每个分块存储为单独的文档。默认情况下,GridFS使用255 kB的区块大小;也就是说,GridFS将文件划分为255 kB的区块,最后一个区块除外。最后一个块的大小只有必要的大小。同样,不大于区块大小的文件只有最后一个区块,只使用所需的空间加上一些额外的元数据。
GriFS的文档几乎包含了实现GridFS所需的所有内容。你可以跟着它走。
因为你的数据是流的,你可以尝试如下...
gs.write(data, callback)如果数据是缓冲区或字符串,则回调将获取两个参数-错误对象(如果发生错误)和指示写入是否成功的结果值。当GridStore未关闭时,每次写入都会附加到打开的GridStore中。
您可以按照此github page获取流相关信息。
https://stackoverflow.com/questions/40175338
复制相似问题