如何从MongoDB文档提取指定字段并返回JSON格式API响应
提取MongoDB用户指定字段并返回JSON格式API响应
问题场景
现有MongoDB用户文档结构如下:
{ "_id": { "$oid": "638df6dd4774e9573010b138" }, "username": "abc", "email": "abc@xyz.com", "stats": { "ranking": "1", "match": "0.214" }, "stats_extra": { "pre_ranking": "10", "pre_match": "0.290" } }
需要实现一个API接口,仅提取每个用户的username和stats字段,并返回如下格式的JSON响应:
{"data": [ {"username":"abc", "stats":{"ranking": "1","match": "0.214"}} , {"username":"xyz", "stats":{"ranking": "10","match": "0.2104"}} , {"username":"ijk", "stats":{"ranking": "12","match": "0.2014"}}] }
目前能打印出目标字段,但无法组装成指定格式返回。
解决方案
方法1:手动构造目标字典
遍历查询结果时,逐个提取需要的字段构造字典,存入列表后返回:
@app.get("/Stats", tags=["userstats"]) def get_stats(): # 初始化空列表存储用户数据 user_stats = [] # 遍历所有用户文档 for doc in app.Users.find(): # 构造仅包含目标字段的字典 user_item = { "username": doc["username"], "stats": doc["stats"] } user_stats.append(user_item) # 按要求格式返回 return {"data": user_stats}
方法2:使用MongoDB投影优化查询
直接在查询时指定只返回username和stats字段(排除默认返回的_id),减少数据传输量:
@app.get("/Stats", tags=["userstats"]) def get_stats(): # 投影参数:1表示保留字段,0表示排除字段 projection = {"username": 1, "stats": 1, "_id": 0} # 查询并直接转换为列表 user_stats = list(app.Users.find({}, projection)) # 返回指定格式 return {"data": user_stats}
两种方法都能得到你需要的JSON响应格式,推荐用方法2,因为它在数据库层面就过滤了不需要的字段,性能更优。
内容的提问来源于stack exchange,提问作者M_Arad
相关产品推荐
相关产品推荐

