我有一个类似这样的架构:
{
_id: <objectid>
customer: <objectid>
employee: <objectid>
date: <Month/day/year>
amount: <Number>
}
使用 Angular ,我试图制作一个页面来提取该数据并为每天构建单独的表。因此,就像我昨天会有一个选项卡一样,这将打开一个表的 View ,其中列出了我的所有员工及其当天的总和。像这样的事情:
[{
date: 10/29/2019
dataFromThisDate: [
{
employee: <name>
sumAmount: <sum(amount for this date)>
list: [<array of all of the transaction _ids
},
{
employee: <name 2>
//etc
}]
},
{
date: 10/30/2019
dataFromThisDate: //etc
}]
基本上,据我所知,只是:
MyCollection.aggregate(
[{
$group: {
_id: "$date"
}
}],function(err, result) { //blah }
)
但我不确定如何进行嵌套分组(首先按日期,然后按该日期的员工)。只是想一想,感觉我必须按日期分组,然后将所有数据传递到新的分组管道?
抱歉,我没有更多我尝试过的东西,整个聚合的事情对我来说是全新的,我找不到与我想要学习的内容足够相似的好例子。我查看了 mongodb 的 api 文档,了解了它们的基本示例并尝试了它们,但我很难想出如何完成更复杂的示例。
最佳答案
你可以尝试这样的事情。这使用了两个组。首先按日期和员工分组,汇总金额并添加交易 ID。按日期第二组并添加员工及其总金额和交易列表。
aggregate([{
$group: {
_id: {
date: "$date",
employee: "$employee"
},
amount: {
$sum: "$amount"
},
transactionIds: {
$push: "$_id"
}
}
}, {
$group: {
_id: "$_id.date",
dataFromThisDate: {
$push: {
employee: "$_id.employee",
sumAmount: "$amount",
list: "$transactionIds"
}
}
}
}])
输出
{
"_id": "12/21/2016",
"dataFromThisDate": [{
"employee": "employee1",
"sumAmount": 100,
"list": [ObjectId("58151e881ac3c9ce82782663")]
}, {
"employee": "employee2",
"sumAmount": 73,
"list": [ObjectId("58151e881ac3c9ce82782665"), ObjectId("58151e881ac3c9ce82782666")]
}]
}
关于javascript - 无法理解复杂的 $group'ing/aggregation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323663/