【发布时间】:2021-04-27 00:45:17
【问题描述】:
我是 MongoDB 的新手,我正在尝试基于两个相关集合和第三个集合检索一种排行榜,根据其不同的属性引用这两个集合中的一个。
考虑如下架构:
tree: { _id, company_id: string, company_name }
link: { _id, company_id: string, url: string }
analytics: { _id, tree_id: string, link_id: string, views: number, clicks: number, date: string }
analytics 文档可以同时包含 tree_id, views 或 link_id, clicks。
我现在想要实现的是总点击次数+观看次数的一种“排行榜”,从analytics集合开始,与tree和link一起加入,最后检索总和点击次数和观看次数。
我已经设法使用以下代码检索了特定 company_id 的总和
db.analytics.aggregate([{
$lookup: {
from: "trees",
as: "trees",
localField: "tree_id",
foreignField: "_id"
}
}, {
$lookup: {
from: "links",
as: "links",
localField: "link_id",
foreignField: "_id"
}
}, {
$match: {
$or: [
{"trees.company_id": "1"},
{"links.company_id": "1"}
]
}
}, {
$group: {
_id: null,
views_count: {
$sum: "$views"
},
clicks_count: {
$sum: "$clicks"
}
}
}])
但我找不到获得类似结果列表的方法
{ company_id: 1, company_name: "foo", clicks: 100, views: 200 },
{ company_id: 2, company_name: "bar", clicks: 200, views: 200 }
等等。
到目前为止,我尝试的是按不同的 _id 分组,这并没有像我预期的那样工作
db.analytics.aggregate([{
$lookup: {
from: "trees",
as: "trees",
localField: "tree_id",
foreignField: "_id"
}
}, {
$lookup: {
from: "links",
as: "links",
localField: "link_id",
foreignField: "_id"
}
}, {
$group: {
_id: "$trees.company_id",
views_count: {
$sum: "$views"
},
clicks_count: {
$sum: "$clicks"
}
}
}])
它不会将clicks_count 分配给特定条目,而是输出类似
{ "_id" : [ "1" ], "views_count" : 6, "clicks_count" : 0 }
{ "_id" : [ ], "views_count" : 0, "clicks_count" : 48 }
{ "_id" : [ "2" ], "views_count" : 10, "clicks_count" : 0 }
我什至不确定这个架构是否是最好的解决方案,所以我也会感谢任何设计建议或类似的东西。
根据下面的评论,我尝试在分组结果之前解构trees,但它只输出了company_id, views_count,没有计算clicks,如下
{ "_id" : "2", "views_count" : 10, "clicks_count" : 0 }
{ "_id" : "1", "views_count" : 6, "clicks_count" : 0 }
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework