不知道能不能做到,但我得问:
我可以在一个请求中发送多个聚合吗?换言之,与其做以下工作:
one_results = db.results.aggregate([
{ $project: { _id: 0, key: "$Field1" }},
{ $group: { '_id': '$key', count: { $sum: 1 }}} ])
two_results = db.results.aggregate([
{ $project: { _id: 0, key: "$Field2" }},
{ $group: { '_id': '$key', count: { $sum: 1 }}} ])我想做这样的事:
[one_results, two_results] = db.results.aggregate(
[
{ $project: { _id: 0, key: "$Field1" }},
{ $group: { '_id': '$key', count: { $sum: 1 }}}
],
[
{ $project: { _id: 0, key: "$Field1" }},
{ $group: { '_id': '$key', count: { $sum: 1 }}}
])我知道这有点牵强,但我得问.
谢谢
发布于 2014-03-12 00:22:33
技术上的答案肯定是否定的。不支持。
与计算聚合结果相比,向服务器发出请求的开销要小得多,因此将两个请求作为数组发送没有什么好处。对于许多驱动程序,您可以只发送两个单独的请求,甚至异步地提供类似的结果(如果负载可以分布的话)。
虽然您可以在一个管道中进行多个计算,但是您可能希望避免可能不相关的聚合计算,可能需要花费比它更高的CPU和IO成本,而且,许多管道不能很好地将它们组合成一个。
例如,第一个管道操作符是$match语句,它们选择了一个非常不同的文档子集,因此合并它们是不实际的(通常建议使用索引过滤尽可能多的文档,就像使用管道的第一步一样)。
发布于 2021-12-09 09:05:08
是的,使用$facet是可能的,参见蒙戈文献
在您的用例中:
results = db.results.aggregate([
{ $facet:
{
one_result: [
{ $project: { _id: 0, key: "$Field1" }},
{ $group: { '_id': '$key', count: { $sum: 1 }}} ],
two_result: [
{ $project: { _id: 0, key: "$Field2" }},
{ $group: { '_id': '$key', count: { $sum: 1 }}} ],
}
}];
// result 1
... = results[0].one_result
// result 2
... = results[0].two_result https://stackoverflow.com/questions/22334691
复制相似问题