2014-09-25 43 views
0

我有以下架構複雜的位置數據庫:MySQL中的MongoDB和查詢相當於該模式

table States 
id : INT PK AutoIncrement 
name : VarChar 50 UNIQUE 

table Counties 
id: INT PK AutoIncrement 
stateID : INT ForeignKey ->States(id) 
name : VARCHAR(50) 

table Towns : 
id: INT PK AutoIncrement 
stateID : INT ForeignKey ->States(id) 
countyID : INT ForeignKey ->Counties(id) 
name : VARCHAR(50) 

table listings 
id : INT PK autoincrement 
name: varchar(50) 
stateID: INT 
countyID: INT 
townID: INT 

當我想以樹的形式是這樣來顯示地理分配的一些統計數據:

  • STATE1(105個結果)
    • 縣1(50個結果)
    • 縣2(55個結果)
      • 鎮1(20個結果)_
      • 鎮2(35個結果)
  • STATE2(200個結果) 等...

在MySQL我將有做過這樣的查詢:

**第一級:**

select count(*) as nb, S.namem, S.id as stateID from listings L INNER JOIN States S ON S.id=L.stateID GROUP BY S.id; 

** 2D級別:**

foreach(results as $result){ 
     $sql = "select count(*) as nb, from listings L INNER JOIN Counties C ON C.id=L.countyID WHERE L.stateID=".$result['stateID']; 
}); 

等等......有一種方法做,在MySQL中的獨特的長查詢過。

這是一個普通的查詢,它在Mysql的SSD磁盤上非常快。

我開始學習mongoDB,我想知道我應該使用什麼樣的模式來存儲我的位置數據來優化這個$ count()和$ group()操作。

哪個mongo查詢可以完成這項工作?

回答

1

存儲與像listings表結構的文件:

{ 
    "name" : "listing0", 
    "state" : "Maryland", 
    "county" : "Washington", 
    "town" : "Faketown" 
} 

然後,只需找到三聯與聚合管道

> db.listings.aggregate([ 
    // hopefully an initial match stage to select a subset of search results or something 
    { "$group" : { "_id" : { "state" : "$state", "county" : "$county", "town" : "$town" }, "count" : { "$sum" : 1 } } } 
]) 

每上市(州,國家,鎮)的數量在這裏您可以通過遍歷結果遊標來計算樹的更高級別的數字,也可以運行類似的管道來計算樹的更高級別的數字。例如,對於在特定狀態下的縣數

> db.listings.aggregate([ 
    // hopefully an initial match stage to select a subset of search results or something 
    { "$match" : { "state" : "Oregon" } }, 
    { "$group" : { "_id" : { "state" : "$state", "county" : "$county" }, "count" : { "$sum" : 1 } } } 
]) 
+0

尼斯〜只是爲了確認,如果我有10個州的列表,我要顯示與計數的每個狀態的樹,一個國家「我的樹展開了,我將不得不做2個查詢。一個按州計算,另一個計算展開的樹,按縣分組。 我還會使用整數來計數/分組數據,因爲它比文本匹配更快。 – Ant 2014-09-26 03:35:46

+0

取決於客戶端處理的方法/數量。如果您執行客戶端掃描並在結果中進行求和,您可以從一個查詢中獲取樹的所有更高級別以獲取最低級別的計數。 – wdberkeley 2014-09-26 15:56:48