首页 > 解决方案 > Concat 两个聚合查询 MongoDB

问题描述

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

{'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']

标签: mongodbpymongo

解决方案


您可以使用$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"}}
])

推荐阅读