我需要在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
答案 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}}
祝你好运!