Concat两种聚合查询MongoDB

时间:2020-04-28 19:41:39

标签: mongodb pymongo

我有一个看起来像这样的收藏集:

{'start': '2011-01-29',
  'target': [0.0, 2.0],
  'cat': [0, 0, 0, 0, 0],
  'state': 0},
...

我必须使用db.collections.aggregate([])在此集合中进行一些汇总,并且由于性能问题,我不得不分为两个查询。

第一个返回我:

{'_id': {'state': 0, 'id': 0},
  'start': '2011-01-29',
  'cat': [0, 0, 0, 0, 0]}
...

第二个人返回我:

{'_id': {'state': 0, 'id': 0},
  'target': [0, 2, 1]
  }
...

我想知道,是否有办法再次基于_id加入结果?

还是有一种方法可以将两个查询独立声明为一个查询?

db.collections.aggregate([
query1: {},
query2: {}
concat(query1,query2) ])

我想要的输出:

再次合并两个输出

{'_id': {'state': 0, 'id': 0},
  'start': '2011-01-29',
  'cat': [0, 0, 0, 0, 0]}
...

{'_id': {'state': 0, 'id': 0},
  'target': [0, 2, 1]
  }
...

进入

{'_id': {'state': 0, 'id': 0},
  'start': '2011-01-29',
  'target': [0, 2, 1]
  'cat': [0, 0, 0, 0, 0]}
...

到目前为止,我的解决方案是使用pymongo:

x1 = db.collection.aggregate(query1)

x2 = db.collection.aggregate(query2)

for i, j in zip(x1, x2):
    j['target'] = i['target']

2 个答案:

答案 0 :(得分:1)

要回答您所陈述的问题,不可能直接将您的单个结果集发送到MongoDB,以使其对它们执行更多操作。这样做是没有意义的,因为构造这样的请求将需要将两个结果集都存储在内存中,此时,您应该简单地将它们合并到应用程序中,而不是在数据库中执行相同的操作并将数据移回并通过网络。

从技术上讲,您可以创建两个临时集合,将每个结果集插入其各自的集合中,然后执行另一次聚合...

答案 1 :(得分:1)

您可以在$facet阶段获得该行为,然后使用$group将它们组合在一起

db.collection.aggregate([
   {$facet:{
       query1:[pipeline1],
       query2:[pipeline2]
   }},
   {$project:{
       result:{$concatArrays:["$query1","$query2"]}
   }},
   {$unwind: "$result"},
   {$group: {
         _id:"$_id",
         document: {$mergeObjects:"$$ROOT"}
   }},
   {$replaceRoot:{ newRoot: "$document"}}
])