如何在MongoDB中使用in子句进行聚合

时间:2018-01-18 14:28:38

标签: mongodb

我的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

1 个答案:

答案 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”在网址列表中的文档。

$sort$limit到顶部。

$expr允许在$ match阶段使用聚合比较运算符。

$in将网址与网址列表进行比较。

$group对网址进行分组并计算出现次数。