我的MongoDB集合如下所示:
{
"url" : "a1",
"user" : "b1",
"time" : ISODate("2017-12-25T00:45:22.148Z")
}
{
"url" : "a2",
"user" : "b2",
"time" : ISODate("2017-12-24T22:45:22.148Z")
}
{
"url" : "a3",
"user" : "b1",
"time" : ISODate("2017-12-24T21:45:22.148Z")
}
.....
我想要给定用户的聚合网址,但只需要该用户的最后N个最新网址。
假设用户最近访问过的网址是:url1,url2,url3,...等 如果N = 2,那么我想只为所有用户计算url1,url2。
我想构建一个类似于这个伪SQL的查询:
select url, sum(url)
from mycollection
where url in (select top N url from mycollection where user=user1)
group by url
答案 0 :(得分:0)
使用3.6中的non-correlated子查询作为您的用例。
像
这样的东西db.mycollection.aggregate(
[{$lookup:{
from: "mycollection",
pipeline:[
{$match:{"user":user1}},
{$sort:{"time":-1}},
{$project:{"url":1}},
{$limit:n}
],
as: "topn"
}},
{$match:{
$expr:{
$in:[
"$url",
"$topn.url"
]
}
}},
{$group: {
_id: "$url",
count: {$sum:1}
}}
)
$lookup
为输入用户提取“url”,然后$match
过滤“url”在网址列表中的文档。
$expr
允许在$ match阶段使用聚合比较运算符。
$in
将网址与网址列表进行比较。
$group
对网址进行分组并计算出现次数。