mongodb中的联合查询不使用map/reduce
Posted
技术标签:
【中文标题】mongodb中的联合查询不使用map/reduce【英文标题】:Union query in mongodb without using map/reduce 【发布时间】:2013-06-18 18:24:21 【问题描述】:如何为 mongo 转换以下 SQL 查询:
SELECT column1 from table1
UNION
SELECT column1 from table2
我最多有 12 个集合,每个月一个:
data.2013.01
data.2013.02
...
...
data.2013.12
在绘图时,我想一次在图表上显示多个月。这给我们带来了一个问题,如何在 mongo 中创建 UNION。
【问题讨论】:
你了解聚合框架吗? @ZagorulkinDmitry 我是 mongo 的新手,现在检查一下。你知道什么可行吗? 我检查了聚合框架。它有管道和运营商,如 $group。但是,它们仍然只适用于单个集合。有什么建议吗? 您可以使用其他集合中的数据创建临时集合,然后绘制图表 【参考方案1】:我认为您将得出的最终结论是您的架构不正确。将所有具有相同用途和形状的对象放入一个集合中。这就是如何与 mongodb 协调工作。按月收集是一个错误,会导致您与 mongo 进行无休止的不必要战斗。一旦您按预期将所有内容都包含在一个集合中,聚合可以根据aggregation example of usernames ordered by join month 为您按月处理分组。
【讨论】:
我明白你的意思,我认为它在你提供的链接中是有效的。然而,我的应用程序与网络分析相似,但目的不同,它跟踪不同的数字。每个集合都有一个月的聚合数据,每个文档都有一天的聚合数据和一天中每个小时的嵌入文档。像这样组织数据将使读取速度非常快。对于一个月的数据,如果我使用您提供的样本,我将只查询 30 个文档,而不是数千个文档。正如我在链接中提到的方法可能适用于其他场景。 似乎,我是 mongo 的新手,并且仍在为应用程序弄清楚功能,这让我错过了你的观点。我可以保持文档的结构与我的相同,但应该将所有文档放在一个集合中。说得通。抱歉,我第一次阅读您的答案时没有得到那个。谢谢@Peterlyons 请记住,您还可以从主集合映射/减少到特定月份的集合,并获得快速/缓存读取。但是 mongo 需要对单个集合进行操作,根据定义,“无论您需要什么 mongo 来运行操作”,这就是您的规范数据需要存在的地方。【参考方案2】:首先阅读:
http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/
mongo 没有 union
之类的东西,但我认为 $or
会满足您的需求。
阅读这个答案:https://***.com/a/14928646/1321404
【讨论】:
我阅读了您建议的文档和问题。似乎不可能在 mongo 中使用多个集合创建 UNION。你的回答让我明白了。将尝试在应用程序端解决这个问题。【参考方案3】:从Mongo 4.4
开始,聚合框架提供了一个新的$unionWith
阶段,执行两个集合的并集(来自两个集合的组合管道结果到一个结果集中):
// collection1:
// "date" : "2013-12-27", "origin" : "collection1"
// "date" : "2017-03-11", "origin" : "collection1"
// collection2:
// "date" : "2014-11-02", "origin" : "collection2"
db.collection1.aggregate([
$unionWith: "collection2" ,
$project: date: true
])
// "date" : "2013-12-27"
// "date" : "2017-03-11"
// "date" : "2014-11-02"
请注意,您可以通过先选择列然后执行联合来获得相同的结果(正在合并的集合可以在执行联合之前应用聚合管道):
db.collection1.aggregate([
$project: date: true ,
$unionWith:
coll: "collection2",
pipeline: [ $project: date: true ]
])
【讨论】:
以上是关于mongodb中的联合查询不使用map/reduce的主要内容,如果未能解决你的问题,请参考以下文章