2013-01-31 128 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