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的主要内容,如果未能解决你的问题,请参考以下文章

Hive - 分区查询不返回任何内容

mongodb 怎么查询树形结构

mongodb 查询子节点

mongodb怎么查询多个关键字?

MYSQL 多表联合查询问题

mongodb怎么查询一天中24个小时内的各个数据集合