带变量的PyMongo查询不返回任何结果 [英] PyMongo query with variables returns no results

查看:34
本文介绍了带变量的PyMongo查询不返回任何结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试运行一个使用字符串变量构造的查询,但奇怪的是,只有在使用该变量时才会得到任何结果。我认为这可能是pymongo包中的错误,但我想确保我没有遗漏什么。

我运行的是pymongo v3.11.2、mongo server 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后端接受用户输入并返回匹配的搜索结果。

我已尝试将变量转换为字符串,对其进行编码,然后在其他位置构造查询,但均未成功。

推荐答案

不可复制。下面的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'}

这篇关于带变量的PyMongo查询不返回任何结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆