得到最后一个不同的元素Mongodb,mysql

时间:2012-08-17 16:04:31

标签: mysql mongodb

我有以下架构的集合:

{
  "_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

更好

1 个答案:

答案 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函数并对传感器进行分组并按时过滤来干净利落地完成此任务。

希望这有帮助。