使用MongoDB MapReduce方法执行sql查询[重复]

Posted

技术标签:

【中文标题】使用MongoDB MapReduce方法执行sql查询[重复]【英文标题】:Use MongoDB MapReduce method to perfom sql query [duplicate] 【发布时间】:2014-07-19 20:17:09 【问题描述】:

我以前在 SQL Server 中有两个表:

Branch(branchNo, city)
Staff(branchNo, staffNo, staffName)

在 SQL Server 上,我可以查找特定城市的所有员工,使用:

select staffName from Branch, Staff where
Branch.branchNo == Staff.branchNo AND city = 'a specific city'

现在在mongoDB中,我把两张表的内容放在一个集合中,如何使用MapReduce来获得同样的sql查询效果?

【问题讨论】:

您能展示一下您的 MongoDB 集合的结构吗? 这称为连接。 MongoDB 不做连接,而是做不同的事情。查看 MongoDB 网站上Data Modelling 上的文档部分。 一些行类似于(BranchNo:"B001", city:"NYC") 其他一些行类似于(BranchNo:"B001", staffNo:"s001", staffName:"John") 【参考方案1】:

您的数据导入错误。真正看看 Neil 链接到的有关数据建模的 MongoDB Docs。但我知道,当您来自关系数据库背景时,MongoDB 可能会让您感到困惑。

我建议你在导出的时候加入数据

SELECT staffNo, staffName, branchNo, city FROM Branch, Staff 
WHERE Branch.branchNo = Staff.branchNo

并将其放入 MongoDB 文档中,如下所示:

staffNo: "s001", staffName: "John", BranchNo: "B001", city:"NYC"

(不确定branchNo 是否有意义或仅用于连接两个表。在后一种情况下,您可以省略它。

那么您要查找一个城市的所有员工的查询就是

db.collection.find("city": "NYC")

【讨论】:

将所有属性放在一行中,方便查询,但也会对消耗的磁盘空间产生巨大影响,因为它们的行数会明显多于原来的行数。如何解决这个问题? 嗯,是的,这是您在使用面向文档而不是关系数据库时必须做出的一种权衡。 OTOH 我怀疑在您的示例中影响将是“巨大的”,因为它只是主表的一个字段,并且您不需要 branchNo / city 表。如果您真的对此感到担忧(您不应该这样做),那么您也可以在 MongoDB 中将数据拆分为多个集合 - 您只需要完成连接即可你自己。请参阅 Neil 在他的第二条评论中链接到的帖子。

以上是关于使用MongoDB MapReduce方法执行sql查询[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 聚合操作

MongoDB 聚合操作(转)

在 MongoDb 中使用 MapReduce 与使用 Celery 和 RabbitMq 的分布式队列进行数据分析

Node.js/Mongoose/MongoDb Typescript MapReduce - emit() 和 Array.sum() 方法

Node.js/Mongoose/MongoDb Typescript MapReduce - emit() 和 Array.sum() 方法

MongoDB 聚合操作