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
值
aggregate(
[{"$setWindowFields":
{"sortBy": {"points": -1}},"output": {"rank": {"$rank": {}}}},
{"$match": {"$expr": {"$eq": ["$_id", 3]}}},
{"$project": {"_id": 0, "rank": 1}}])
查询2
- 更复杂,但只有 1 个查询,并且没有
$setWindowFields
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 它应该工作。
您好!
我用的是最新的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
值
aggregate(
[{"$setWindowFields":
{"sortBy": {"points": -1}},"output": {"rank": {"$rank": {}}}},
{"$match": {"$expr": {"$eq": ["$_id", 3]}}},
{"$project": {"_id": 0, "rank": 1}}])
查询2
- 更复杂,但只有 1 个查询,并且没有
$setWindowFields
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 它应该工作。