Как установить параметры сортировки для запроса find_raw_batches - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно искать в базе данных Mongo, используя индекс с определенным набором параметров сортировки.Однако, когда я звоню db[coll].find_raw_batches(filter=filter, collation=collation), сортировка, по-видимому, не распространяется на сервер как часть запроса на поиск.Мне удалось воспроизвести это в изолированной настройке со следующим кодом:

import pymongo
  from pymongo import MongoClient
  from pymongo.collation import Collation, CollationStrength

  def main():
    collection_name = 'test'
    mongo_url = 'mongodb://localhost:27017' # some running mongo instance
    client = MongoClient(mongo_url)
    try:
      db = client.get_database()

      # drop existing collection
      collection = db[collection_name]
      collection.drop()

      # create indexes
      collection.create_index([('test', pymongo.TEXT)], language_override='index_lang', default_language='en')
      collation = Collation('en', strength=CollationStrength.SECONDARY)
      collection.create_index('not_text', collation=collation)

      # run a dummy query
      filter={'$or': [{'$text': {'$search': 'test text'}}, {'not_text': {'$eq': 'test not-text'}}]}
      cursor = collection.find_raw_batches(filter=filter, collation=collation)
      touch_cursor(cursor)
  finally:
    client.close()

  def touch_cursor(cursor):
    for item in cursor:
      break

  if __name__ == '__main__':
    main()

Это ошибка, которую я получаю:

pymongo.errors.OperationFailure: ошибка базы данных:Ошибка обработки запроса: ns = test.testTree: $ или

not_text $ eq "test not-text"

TEXT: query = тестовый текст, language = english, caseSensitive = 0, diacriticSensitive =0, tag = NULL

Сортировка: {}

Proj: {}

ошибка планирования: не удалось создать решение для TEXT в OR или в других не-TEXT предложенияхпод ИЛИ также должны быть проиндексированы.

То же самое работает, если я использую find вместо find_raw_batches.Мое чтение документации говорит о том, что это должно поддерживаться как для find, так и find_raw_batches, но каким-то образом сортировка теряется при использовании find_raw_batches.

Обратите внимание, что объединение index-with-collation с текстовым индексом только делает проблему более очевидной.В том же сценарии, что и выше, запрос в поле 'not_text' не будет нечувствительным к регистру, даже если сортировка диктует иное.

Поэтому мой вопрос: как я могу (могу ли я?) Сделатьэто работа?

...