Python 带变量的PyMongo查询不返回任何结果
我试图运行一个使用字符串变量构造的查询,但奇怪的是,只有在使用该变量时,我才没有得到任何结果。我认为这可能是pymongo包中的一个bug,但我想确保我没有遗漏什么 我正在运行pymongo v3.11.2、mongo服务器v4.4和python v3.9 此查询不返回任何结果,并立即退出,无错误:Python 带变量的PyMongo查询不返回任何结果,python,mongodb,pymongo,Python,Mongodb,Pymongo,我试图运行一个使用字符串变量构造的查询,但奇怪的是,只有在使用该变量时,我才没有得到任何结果。我认为这可能是pymongo包中的一个bug,但我想确保我没有遗漏什么 我正在运行pymongo v3.11.2、mongo服务器v4.4和python v3.9 此查询不返回任何结果,并立即退出,无错误: keyword = 'some text' results = db.myCollection.aggregate([ { '$match': { '
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
不可复制。下面的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
$text和$regexFindAll都不如使用Lucene的MongoDB Atlas搜索。您应该查看它,因为您将获得更好的结果和性能。有一个免费的层:$text和$regexFindAll都比使用Lucene的MongoDB Atlas搜索差得多。您应该查看它,因为您将获得更好的结果和性能。还有一个免费层:我还在jupyter笔记本中运行我的查询。不确定发生了什么,但第二天运行完全相同的代码,效果如预期。一定是我运行的内核出了问题。我还在jupyter笔记本中运行我的查询。不确定发生了什么,但第二天运行完全相同的代码,效果如预期。我运行的内核一定有问题。