我有一个看起来像这样的收藏集:
{'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']
答案 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"}}
])