MongoDB:将平均速度存储为现场或计算

时间:2012-11-02 10:17:13

标签: mongodb gps acid

我正在开发一个Android应用程序,它使用MongoDB以文档格式存储用户记录。我将有几条记录包含有关GPS轨道的信息,例如开始经度和纬度,完成经度和纬度,总时间,最高速度和总距离。

我的问题是关于平均速度。我应该让我的应用程序计算平均速度并将其作为字段存储在文档中,还是应该通过仅获取时间和距离来计算?

我将有数千条记录应该根据平均速度进行排序,最合理的似乎也是将平均速度存储在文档中。然而,这远离传统的SQL Acid思维,其中速度将在DB之外计算。

记录集的当前文档结构如下:

DocumentID (record)
DocumentID (user)
Start lnlt
Finish lnlt
Start time/date/gmt
End time/date/gmt
Total distance
Total time
Top speed
KMZ File

2 个答案:

答案 0 :(得分:1)

一旦您选择使用面向文档的数据库(如Mongo),就不应该讨论ACID属性。现在,你自己回答了这个问题:

合理似乎也存储了文档中的平均速度。”

我们程序员倾向于忽略合理或简单的方法。每当我们发现的解决方案看起来很明显或常识时,我们总是试图质疑我们的自我; - )。

无论如何,我的建议是存储它,因为你想要由DB而不是应用程序执行排序。这意味着如果影响平均速度的任何变量在初始存储后发生变化,那么您应该记得更新结果字段。

答案 1 :(得分:1)

  

我的问题是关于平均速度。我应该让我的应用程序计算平均速度并将其作为字段存储在文档中,还是应该通过仅获取时间和距离来计算?

正如@Panegea正确地说,MongoDB不依赖于ACID属性。它依赖于你的应用程序能够自己控制它的分布式特性,然而据说计算DB之外的平均速度并不是那么糟糕,并且使用像$set这样的原子运算符会在不是使用完整的ACID查询。

您和@Panegea谈论的是将您所需的值预先汇总到文档上预定义字段的形式。这是迄今为止推荐的方法,不仅在MongoDB中,而且在SQL中(如在Facebook墙上的帖子中的总份额),查询计算字段的聚合对于服务器来说是令人厌倦的并且非常困难,或者只是不明智。

修改

你可以通过聚合框架来实现这个目标:http://docs.mongodb.org/manual/applications/aggregation/,也许想看一看,但预聚合是迄今为止最快的方法。

相关问题