Привет!
Я использую последнюю версию MongoDB (5.3) pymongo==4.1.1
У меня есть коллекция с пользователями. У каждого из них есть ключ 'points'
. Когда пользователь открывает свой профиль, я хочу показать его МЕСТО В ЛИДЕРЕ, отсортированный по ключу 'points'
.
Я видел агрегацию $ранг в документах, но для выполнения этого запроса я должен использовать $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
. Я делаю запрос и узнаю, что его место 1-й, потому что у него самое большое количество очков. Мне не нужно получать все документы в коллекции, потому что там даже больше 100к документов. Мне нужно только значение индекса.
Был вполне тот же вопрос, но цель так и не достигла, с помощью этого метода вы получаете отсортированный список документов, и каждый из них просто имеет свой индекс, но все равно вы не можете найти индекс одного текущего документа с конкретным '_id'
:(
Спасибо за помощь!
Запрос1
_id
aggregate(
[{"$setWindowFields":
{"sortBy": {"points": -1}},"output": {"rank": {"$rank": {}}}},
{"$match": {"$expr": {"$eq": ["$_id", 3]}}},
{"$project": {"_id": 0, "rank": 1}}])
Запрос2
$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, он должен работать.
setwindowfields является новым, но Query2 работает с mongodb 3.6+, они оба возвращают курсор, см. документацию по драйверу python, если они работают онлайн, значит, что-то не так, связанное с вашим кодом python.
на сайте Playground все работает, а на моем компе оба метода не работают или работают некорректно и ничего не возвращают