Получен индекс ранжирования Python MongoDB?

Привет!

Я использую последнюю версию 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' :(

Спасибо за помощь!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Запрос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, он должен работать.

на сайте Playground все работает, а на моем компе оба метода не работают или работают некорректно и ничего не возвращают

Alexandr T 23.04.2022 11:45

setwindowfields является новым, но Query2 работает с mongodb 3.6+, они оба возвращают курсор, см. документацию по драйверу python, если они работают онлайн, значит, что-то не так, связанное с вашим кодом python.

Takis 23.04.2022 12:56

Другие вопросы по теме