我有一个复杂的位置数据库,其中包含以下架构:
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
当我想以树形式显示有关地理分区的一些统计数据时:
在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查询可以完成这项工作?
答案 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 } } }
])