2013-01-31 103 views
0

我正在尝试实现MongoDB已经证明相当困难的事情。MongoDB排序,计数,查询问题。需要的逻辑帮助

我有2个系列。一个称为“标记”,另一个称为“路线”,并保存用户在标记之间创建的路线。路线集合有两个重要字段:[start_marker]和[end_marker]。这些字段是标记集合中标记的_id。

浏览地图时,应用程序会对标记集合进行地理空间框查询以在地图上查找和显示标记。

当用户点击标记时,气泡显示标记名称。

名称下方还有一个动态字段,我遇到了问题。此字段应该显示:

  • 从选定的标记驱动到地图上什么标志
  • 多少次,这些标记被驱赶
  • 只有3个最频繁驱动标记将被显示在动态字段

由于我的记录集合记录了[start_marker]和[end_marker] _ids,因此我在[start_marker]字段中查询选定标记_id的记录集合。

这会生成几百个文档,其中所选标记始终位于[start_marker]字段中。现在,我想排序哪些[end_markers]发生的次数最多,计算它们出现的次数,挑选前3个,取出它们的_ids并用它们查询标记集合以提取标记名称。

问题是,伯爵需要我知道哪个结束标记字段要计数,这又要求我知道它发生的频率。抓22.

结束气泡的结果将是这样的:

市1

市16 - 256倍

市21 - 118倍

市4 - 88倍

我可以改变数据库结构,因为Mongo是无模式的,可能会添加一个计数在某个地方,但我现在处于完全失落状态。此查询每秒会发生几百次,因此映射减少可能会对数据库性能产生负面影响。一些输入将不胜感激!

+0

您是否尝试过使用聚合框架来总结'end_markers',然后你可以限制获得前3名。 – Ross

+0

我看着它,但它似乎计数只会产生有限的产出,而只会产生特定的变数。总结与伯爵不同的命令? – Karl

回答

0

我相信我找到了一个足够简单的答案。

  1. 创建另一个名为“routes”的集合。
  2. 添加3个字段:[start_city],[end_city],[count]。
  3. 当用户在“records”集合中创建一个文档时,还要在“routes”集合中创建一个文档。
  4. 将[count]字段加1。
  5. 每次在同一条路线上保存一条新记录时,将“routes”集合中的计数值加1。
  6. 查看地图标记时,请在[start_marker]集合中查询marker_id的“routes”集合。排序方式算,结果限制为3