PythonMongoDB排名指数收?

Python MongoDB ranking index receiving?

您好!

我用的是最新的MongoDB(5.3)pymongo==4.1.1 我有一个用户集合。他们每个人都有一个 'points' 键。当用户打开他的个人资料时,我想显示他的 排行榜中的位置 'points' 键排序。

我已经看到 $rank aggregation in the docs, but to make this query i should use the $setWindowFields,但我收到一个错误:

pymongo.errors.OperationFailure: Unrecognized pipeline stage name: '$setWindowFields', full error: {'ok': 0.0, 'errmsg': "Unrecognized pipeline stage name: '$setWindowFields'", 'code': 40324, 'codeName': 'Location40324'}

我试了很多方法,都没有用。如何解决我的问题,或建议我一个新的解决方案

[
    {"_id": 1, "points": 10},
    {"_id": 2, "points": 30},
    {"_id": 3, "points": 90},
    {"_id": 4, "points": 50}
]

例如,我想查看 '_id': 3 玩家所在的位置。我查询了一下,发现他的位置是1st,因为他的积分值最高。我不需要接收所有收集的文件,因为有超过 100k 的文件。我只需要索引值。

有一个相当,但目标还没有达到,使用这种方法你会收到排序的文档列表,每个文档都有它的索引,但无论如何你找不到具有特定 '_id' 的当前文档的索引 :(

感谢您的帮助!

查询 1

  • 这是如何操作的简单示例,我认为您需要这个
  • 您可以将 3 替换为 _id

Playmongo

aggregate(
[{"$setWindowFields": 
   {"sortBy": {"points": -1}},"output": {"rank": {"$rank": {}}}},
 {"$match": {"$expr": {"$eq": ["$_id", 3]}}},
 {"$project": {"_id": 0, "rank": 1}}])

查询2

  • 更复杂,但只有 1 个查询,并且没有 $setWindowFields

Playmongo

coll.aggregate(
[{"$match": {"$expr": {"$eq": ["$_id", 2]}}},
 {"$lookup": 
   {"from": "coll",
    "pipeline": 
     [{"$match": {"$expr": {"$gte": ["$points", "$$points"]}}},
       {"$count": "count"}],
    "as": "rank",
    "let": {"points": "$points"}}},
 {"$project": {"_id": 0, "rank": {"$first": "$rank"}}}])

查询 3

您还可以发送 2 个更简单的查询

  • 查找获取用户积分
  • 查找并统计以获取 >= 积分的用户(在数据库中而不是在客户端上统计,或在聚合和统计阶段统计)

我不知道为什么它说未识别的阶段,如果你有 >= MongoDB 5 它应该工作。