2014-09-25 2 views
0

Я имею сложную базу данных о местоположении со следующей схемой:Mysql для MongoDB и Query Эквивалент этой схемы

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) результаты
      • Town 1 (20 результатов) _
      • Town 2 (35 результатов)
  • State2 (200 результатов) ЭСТ ...

В MYSQL я бы имел сделал такие запросы:

** 1-й уровень: **

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 тоже.

Это тривиальный запрос, и это очень быстро на SSD-диске в Mysql.

Я начинаю изучать mongoDB, и я хочу знать, какую схему я должен использовать для хранения данных местоположения, чтобы оптимизировать эти операции $ count() и $ group().

И какой запрос манго будет выполнять эту работу?

ответ

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

Nice ~ Просто, чтобы подтвердить, если у меня есть список из 10 стран, и я хочу, чтобы отобразить дерево с графом для каждых состояний, с одним государством " s дерево развернулось, мне пришлось бы сделать 2 запроса. Один, чтобы получить счет/группу по состоянию, а другой - развернутое дерево, сгруппированное по графству. Я бы также использовал целое число для подсчета/группировки данных, так как оно быстрее, чем соответствие текста. – Ant

+0

Зависит от способа/объема обработки клиента. Вы можете получить все более высокие уровни дерева из одного запроса, чтобы получить подсчеты на самом низком уровне, если вы выполняете сканирование на стороне клиента и суммируете результаты. – wdberkeley

Смежные вопросы