我有以下架构的集合:
{
"_id" : ObjectId("502e66f201f04e16a8885e8c"),
"sensorID" : 2, // id of the sensor
"loc" : [3, 2], // location of the sensor x,y
"time" : new Date("Fri, 17 Aug 2012 19:44:50 GMT +04:00") // time of the last meausurement
}
因此网络中的传感器很少。他们正在移动,他们每隔x秒就告诉服务器他们的行踪。
我想找到每个传感器的最后通知位置。
我想做的事情:
db.runCommand({distinct: 'points', key: 'sensorID'})
选择所有不同的传感器,但我无法弄清楚上次应该在哪里添加额外的约束。
最重要的问题。我真的应该在mongo中这样做吗?可能只是使用MySql
更好答案 0 :(得分:0)
传感器是否大致同时报告且部分陈旧数据是否可以容忍?
基本上有很多方法可以解决这个问题。
一个是,做类似于db.collection.find({})的事情.sort({time:-1})。limit(#Number of sensors#),这实际上是MAX函数的准时,这将是为您提供传感器的最新位置。然而,这种方法仅在所有传感器同时广播时才起作用,并且当然如果其中一个传感器报告特别慢,则一个传感器的部分过时数据或重复数据,这样一个传感器的竞争条件自传感器上次更新缓慢以来已更新两次,导致它在列表中显示两次,不包括慢速传感器。 。可以通过附加上面的distinct子句来解决这个问题,但是这仍然会导致可能过时的数据,但最多只能一次性。如果每隔一段时间只有一个循环并不是什么大问题,那么这是合情合理的。
另一种方法是使用类似
的方式一次查询每个传感器db.collection.find({“sensorID:#sensorID#”})。sort({time:-1})。limit(1);
另一种方法是将架构更改为具有“最新”标志。当插入新的传感器点和时间时,只需查询该传感器的旧“最新”文档并将其更新为false。这涉及一些错误处理,因为你从不想要没有“最新”并且你正在查询的情况。因此,更好的方法是首先将要插入标志的新文档设置为true。然后将旧文档标志更新为false。然后,如果您在更新之间一次搜索一个,则可以对这两个进行排序并添加限制为1以获得最新的更新。另外,如果你想一次搜索所有这些传感器并找回所有传感器的列表,并且它发生在更新之间,你可以对它们运行一个不同的功能并对这个传感器进行粗略的近似,这很有希望情况下。
或者,您可以通过添加mapreduce函数并对传感器进行分组并按时过滤来干净利落地完成此任务。
希望这有帮助。