首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb聚合:链接聚合

mongodb聚合:链接聚合
EN

Stack Overflow用户
提问于 2014-03-11 19:26:33
回答 2查看 2.6K关注 0票数 1

不知道能不能做到,但我得问:

我可以在一个请求中发送多个聚合吗?换言之,与其做以下工作:

代码语言:javascript
复制
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 }}} ])

我想做这样的事:

代码语言:javascript
复制
[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 }}} 
  ])

我知道这有点牵强,但我得问.

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-12 00:22:33

技术上的答案肯定是否定的。不支持。

与计算聚合结果相比,向服务器发出请求的开销要小得多,因此将两个请求作为数组发送没有什么好处。对于许多驱动程序,您可以只发送两个单独的请求,甚至异步地提供类似的结果(如果负载可以分布的话)。

虽然您可以在一个管道中进行多个计算,但是您可能希望避免可能不相关的聚合计算,可能需要花费比它更高的CPU和IO成本,而且,许多管道不能很好地将它们组合成一个。

例如,第一个管道操作符是$match语句,它们选择了一个非常不同的文档子集,因此合并它们是不实际的(通常建议使用索引过滤尽可能多的文档,就像使用管道的第一步一样)。

票数 3
EN

Stack Overflow用户

发布于 2021-12-09 09:05:08

是的,使用$facet是可能的,参见蒙戈文献

在您的用例中:

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22334691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档