如何在mongodb的一次旅行中执行多个聚合?

时间:2017-07-15 08:27:26

标签: c# mongodb aggregation-framework

我需要在mongodb的一次旅行中执行多个聚合。 在某些情况下,在一个集合上,在另一个集合中。 可能吗? 如果可能,怎么样?

请原谅我糟糕的英语。

我的收藏是这样的:

InitializeInstance.ps1

我想在mongodb的一次旅行中执行以下聚合:

1- { _id: ...., Name: "Name1", LastItem: { _t: "Type3", Count: 5, Date: 2017 }, Items: [{ _t: "Type1", Count: 1, Date: 2016 }, { _t: "Type2", Count: 0, Date: 2013 }, { _t: "Type3", Count: 5, Date: 2017 }, { _t: "Type4", Count: 2, Date: 2010 }, ] }{ _id: ...., Name: "Name2", LastItem: { _t: "Type1", Count: 8, Date: 2017 }, Items: [{ _t: "Type1", Count: 8, Date: 2017 }, { _t: "Type2", Count: 10, Date: 2014 }, { _t: "Type3", Count: 50, Date: 2015 }, { _t: "Type4", Count: 12, Date: 2011 }, ] }{ _id: ...., Name: "Name3", LastItem: { _t: "Type3", Count: 15, Date: 2016 }, Items: [{ _t: "Type1", Count: 11, Date: 2009 }, { _t: "Type3", Count: 15, Date: 2016 }, ] }    groupBy => Name
   where => items containe (Type3)

2- return => count(Name)
   groupBy => Name
   where => LastItem._t = Type3

1 个答案:

答案 0 :(得分:3)

MongoDB 3.4能够使用$ facet同时处理多个聚合框架管道。

$ facet阶段允许您创建多面聚合,这些聚合可在单个聚合阶段内跨多个维度或方面表征数据。多面聚合提供多个过滤器和分类,以指导数据浏览和分析。分面的常见实现是有多少在线零售商通过对产品价格,制造商,尺寸等应用过滤器来提供缩小搜索结果范围的方法。 LINK

这不是可以使用的东西"只要你想要"。在我看来,你应该考虑优化你的管道,而不是创建多个耗时的管道。

然后,您可以通过在同一$组中组合一些条件来解决您的问题。这是一个示例,您可以轻松地进行自定义。

 {$unwind: "$Items"}

   ,{
    $group: {
     _id: "$Name",
     Type3_in_Items: {$sum:   {$cond: [{$eq: ["$Items._t", "Type3"]}, 1, 0]   }},
     Type3_Counts_in_Items: {$sum:   {$cond: [{$eq: ["$Items._t", "Type3"]}, "$Items.Count", 0]   }},
     Type3_in_LastItem: {$addToSet:   {$cond: [{$eq: ["$LastItem._t", "Type3"]}, 1, 0]   }}     
     }
   }

   ,{$sort: {"_id": 1}}

祝你好运!