你好!
我使用最新的 MongoDB (5.3) pymongo==4.1.1 我有一個用戶集合。他們每個人都有一把'points'鑰匙。當用戶打開他的個人資料時,我想顯示他在排行榜中的位置,按鍵排序'points'。
我在檔案中看到了$rank聚合,但要進行此查詢,我應該使用$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. 我做了一些查詢,發現他的位置是第一名,因為他的積分值最高。我不需要接收集合中的所有檔案,因為有超過 100k 的檔案。我只需要索引值。
有一個完全相同的問題,但目標還沒有達到,使用這種方法你會收到排序的檔案串列,每個檔案都有它的索引,但無論如何你找不到一個當前檔案的索引特別'_id':(
感謝您的幫助!
uj5u.com熱心網友回復:
查詢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 個更簡單的查詢
- find 獲取用戶的積分
- 查找并計數以獲取具有 >= 點的用戶(在資料庫中計數而不是在客戶端,或聚合和計數階段)
我不知道為什么它說未識別階段,如果你有 >= MongoDB 5 它應該可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462442.html
上一篇:串列不會按日期排序
下一篇:基于欄位是否存在的分桶
