Запрос PyMongo с переменными не возвращает результатов

Я пытаюсь выполнить запрос, построенный с использованием строковой переменной, но, как ни странно, я не получаю результатов только при использовании переменной. Я думаю, что это может быть ошибка в пакете pymongo, но я хочу убедиться, что ничего не упустил.

Я использую pymongo v3.11.2, сервер mongo v4.4 и python v3.9.

Этот запрос не возвращает никаких результатов и завершается немедленно без ошибок:

keyword = 'some text'
results = db.myCollection.aggregate([
    {
        '$match': {
            '$text': {
                '$search': keyword  # string stored as variable
            }
        }
    }
])

Хотя этот запрос возвращает ожидаемые результаты после некоторого времени вычисления запроса:

results = db.myCollection.aggregate([
    {
        '$match': {
            '$text': {
                '$search': 'some text'  # bare string instead of variable
            }
        }
    }
])

Я получаю аналогичные проблемы на этапе $regexFindAll. У меня НЕ возникает проблем при использовании переменной на шаге проекции.

Я ожидаю, что это будет общий вариант использования. Например, серверная часть Python принимает пользовательский ввод и возвращает соответствующие результаты поиска.

Я пытался преобразовать переменную в строку, закодировать ее и построить запрос в другом месте, но безуспешно.

$text и $regexFindAll просто уступают MongoDB Atlas Search, в котором используется Lucene. Вы должны проверить это, потому что вы получите гораздо лучшие результаты и производительность. Есть бесплатный уровень: docs.atlas.mongodb.com/reference/atlas-search/tutorial
Nice-Guy 13.12.2020 22:33
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Не воспроизводимо. Приведенный ниже сценарий bash (требуется docker) эмулирует ваш код в точной задокументированной среде, и значения правильно возвращаются с использованием переменного аргумента.

PROJECT_NAME=text_search

MONGODB_VERSION=4.4
PYTHON_VERSION=3.9
PYMONGO_VERSION=3.11.2

docker network create local_temp 2> /dev/null
docker run --rm --network local_temp -d --name mongodb_temp mongo:${MONGODB_VERSION}

cd "$(mktemp -d)" || exit

cat << EOF > requirements.txt
pymongo==${PYMONGO_VERSION}
EOF

cat << 'EOF' > ${PROJECT_NAME}.py
from pymongo import MongoClient, TEXT

db = MongoClient('mongodb://mongodb_temp')['mydatabase']

db.myCollection.create_index([('file_name', TEXT)])
db.myCollection.replace_one({'_id': 1}, {'_id': 1, "file_name": "Contains some text we are searching"}, upsert=True)

keyword = 'some text'

cursor = db.myCollection.aggregate([
    {'$match': {'$text': {'$search': keyword}}},
    {'$project': {'file_name': 1}}])

for item in cursor:
    print(item)
EOF

cat << EOF > Dockerfile
FROM python:${PYTHON_VERSION}
COPY ./* /
RUN pip install -r /requirements.txt
CMD ["python", "${PROJECT_NAME}.py"]
EOF

docker build --tag ${PROJECT_NAME}:latest .
docker run --rm --network local_temp --name ${PROJECT_NAME} ${PROJECT_NAME}:latest

docker stop "$(docker ps -a -q --filter name=mongodb_temp)" > /dev/null
docker image rm ${PROJECT_NAME}:latest > /dev/null
docker network rm local_temp > /dev/null

печатает:

{'_id': 1, 'file_name': 'Contains some text we are searching'}

Я также выполнял свои запросы в блокноте Jupyter. Не знаю, в чем дело, но запуск точно такого же кода на следующий день работал, как и ожидалось. Должно быть, какая-то проблема с моим работающим ядром.

Royce Schultz 14.12.2020 13:56

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