Получен индекс ранжирования 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' :(

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

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
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

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