限制在 MongoDB

Limit with ties in MongoDB

我有一个包含电影数据的数据库:片名和年份。我需要一个查询来按年份执行电影计数,return 计数最高的年份。我的挣扎是我需要它是动态的,所以如果有平局,它应该 return 所有“平局”年份。

目前我的查询是这样的:

db.movies.aggregate({$group : {_id : "$year", movies: {$sum : 1}}}, {$sort : {"movies" : -1}}, {$limit : 3})

现在我有三部电影之间的平局,因此限制为 3,但我希望它是动态的。 任何帮助,将不胜感激!提前致谢!

使用double $group,第二组按计数。

db.collection.aggregate({
  $group: {
    _id: "$year",
    movies: {
      $sum: 1
    }
  }
},
{
  "$group": {
    "_id": "$movies",
    "yearList": {
      "$push": "$$ROOT._id"
    }
  }
},
{
  $sort: {
    "_id": -1
  }
},
{
  "$limit": 1
})

mongoplayground

查询

  • 使用 $setWindowFields,需要 MongoDB >= 5
  • 按电影排序(有电影数)
  • $denseRank 将对成员进行排名,但相同的 movie count 将获得相同的排名
  • 我们过滤最大排名 3(如果重复,可能更像下面的示例)

PlayMongo

aggregate(
[{"$setWindowFields": 
    {"output": {"dense-rank": {"$denseRank": {}}},
     "sortBy": {"movies": -1}}},
  {"$match": {"$expr": {"$lte": ["$dense-rank", 3]}}},
  {"$unset": ["dense-rank"]}])