Мне нужно искать в базе данных 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'
не будет нечувствительным к регистру, даже если сортировка диктует иное.
Поэтому мой вопрос: как я могу (могу ли я?) Сделатьэто работа?