如何在MongoDB中实现部分/不完全查询?现有代码问题求助
解决方案
以下是修复后的代码,实现了基于输入关键词的部分匹配查询,同时解决了原代码中只返回最后一条结果、异常处理逻辑不当的问题:
@app.route('/search-all/', methods=['GET', 'POST']) def search_all(): query = request.form.get("SearchBox", "").strip() results = [] if query: # 使用$regex实现不区分大小写的部分匹配 query_filter = { "Films.Title": { "$regex": query, "$options": "i" } } # 查询所有匹配的文档,同时返回匹配的Films元素 for doc in db['mongo-moviedb'].find(query_filter, {"Films.$": 1}): film = doc["Films"][0] results.append({ "title": film["Title"], "genre": film["Genre"], "cast": film["Actors"], "plot": film["Plot"] }) if results: return render_template('Date-Night.html', films=results) else: # 无匹配结果或输入为空时返回提示 error = 'Not found.' if query else 'Please enter a search keyword.' return render_template('Date-Night.html', error=error)
关键修改说明:
- 实现部分匹配:用
$regex替代精确匹配,$options: "i"让查询不区分大小写(输入"star"也能匹配"Star Wars"),完全满足模糊搜索需求。 - 存储所有匹配结果:原代码循环中每次覆盖变量,最后只返回最后一条记录,现在用列表
results存储所有匹配的影片数据,模板中可遍历展示全部结果。 - 优化异常处理:原代码捕获的异常类型并非MongoDB查询会抛出的异常,改成直接检查查询结果是否为空,逻辑更准确。
- 空输入处理:增加对空查询的判断,避免无意义的数据库查询,同时给出友好提示。
模板适配提示
你需要修改Date-Night.html模板,支持遍历films列表展示多条结果,示例如下:
{% if films %} {% for film in films %} <div class="film-item"> <h3>{{ film.title }}</h3> <p>Genre: {{ film.genre }}</p> <p>Cast: {{ film.cast }}</p> <p>Plot: {{ film.plot }}</p> </div> {% endfor %} {% elif error %} <p>{{ error }}</p> {% endif %}
内容的提问来源于stack exchange,提问作者Michael Jason Stokes
相关产品推荐
相关产品推荐

