Mysql到MongoDB和Query等效于此架构

时间:2014-09-25 04:27:59

标签: mysql mongodb count grouping equivalence

我有一个复杂的位置数据库,其中包含以下架构:

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结果)_
      • Town 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 个答案:

答案 0 :(得分: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 } } }
])