【问题标题】:Union query in mongodb without using map/reducemongodb中的联合查询不使用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。但是,它们仍然只适用于单个集合。有什么建议吗?
  • 您可以使用其他集合中的数据创建临时集合,然后绘制图表

标签: mongodb mapreduce union


【解决方案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://stackoverflow.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 } }]
  }}
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多