mongodb中的联合查询,不使用map / reduce

时间:2013-06-18 18:24:21

标签: node.js mongodb mapreduce

是的,我在这里检查了其他工会问题,但这似乎有所不同。

这是我要为mongo转换的SQL查询

SELECT column1 from table1

UNION

SELECT column1 from table2

在我的mongo数据库中,我最多可以有12个集合,每月一个。

data.2013.01
data.2013.02
.
.
data.2013.12

绘图时,我想一次在图表上显示多个月。这就引出了一个问题,即如何在mongo中创建UNION。

3 个答案:

答案 0 :(得分:4)

我认为您将得出的最终结论是您的架构不正确。将具有相同目的和形状的所有对象放入单个集合中。那是如何与mongodb协调工作的。按月制作收藏品是一个错误,会导致你与mongo无休止的不必要的战斗。一旦您按预期在一个集合中包含所有内容,聚合就可以按照aggregation example of usernames ordered by join month按月处理分组。

答案 1 :(得分:1)

首先阅读:

http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/

mongo没有类似union的内容,但我认为$or对您的需求非常有用。

阅读此答案:https://stackoverflow.com/a/14928646/1321404

答案 2 :(得分:0)

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 } }]
  }}
])