如何在Flask+MongoDB中访问嵌套Films列表获取指定字段?
解决MongoDB嵌套Films列表的字段访问问题
核心原因
你的查询结果里,Films是一个列表类型(即使只包含一个电影对象),所以必须先通过索引取出列表中的单个电影字典,再访问其内部字段。
正确的Python代码处理方式
可以在Flask路由中先提取出电影对象,再将需要的字段或整个对象传递给模板:
@app.route('/search-all/', methods=['GET', 'POST']) def search_all(): # 用find_one替代find,因为$投影只会返回第一个匹配的文档 result = db['mongo-moviedb'].find_one({"Films.Title": "Clue"}, {"Films.$": 1}) if result: # 取出Films列表中的第一个电影字典 movie = result['Films'][0] # 提取需要的字段到单独变量 title = movie['Title'] year = movie['Year'] director = movie['Director'] # 将变量传递给模板 return render_template('Date-Night.html', movie=movie, title=title, year=year) # 没有找到匹配电影的情况 return render_template('Date-Night.html', error="未找到指定电影")
模板中的访问方式
如果直接将movie对象传给模板,在Date-Night.html中可以直接访问字段:
<h1>{{ movie.Title }}</h1> <p>上映年份:{{ movie.Year }}</p> <p>导演:{{ movie.Director }}</p>
如果传递的是原始result,则需要先取出列表元素:
{% if result and result.Films %} {% set movie = result.Films[0] %} <h2>{{ movie.Title }}</h2> <p>评分:{{ movie.imdbRating }}</p> {% else %} <p>无匹配结果</p> {% endif %}
为什么你之前的写法无效
x['Films']:返回的是整个Films列表,不是单个电影对象,无法直接访问.Title字段x['Films.Title']:这是MongoDB查询语句的语法,Python字典不支持用这种嵌套字符串键访问值x['Films'],['Title']:语法错误,逗号分隔会生成元组,完全不符合字典访问逻辑
内容的提问来源于stack exchange,提问作者Michael Jason Stokes
相关产品推荐
相关产品推荐

