python - 如何获取具有嵌入式键值对数组的 PyMongo 文档的值(实时)
问题描述
student_info=Studentdb.db.Student.find_one({'username': current_user.username})
如上所述,完整的文档将由此返回
尝试使用以下方法总结每个测试的分数:
subject_info = student_info['subjects.subject_name)']
获取关键错误
KeyError:subjects.subject_name
预期用途是:
需要动态获取 Unit_Test1、Unit_Test2、Unit_Test3、MidTerm、Annual 的键值(即数字),并对所有科目求和
如果没有像主题这样的列表,使用 subject_info['user_name'] 和 subject_info['status'] 很容易得到
find()
函数需要一个值,但是希望从 mongodb Pymongo 文档中动态获取该值。任何线索都会对此有所帮助。
尝试使用以下方法总结每个测试的分数:
subject_info = student_info['subjects.subject_name)']
获取关键错误
KeyError:subjects.subject_name
{
"_id" : Grade01
"user_name" : "TestUser",
"status" : "active",
"subjects" : [
{
"subject_name" : "Computer",
"Unit_Test1 " : 95,
"Unit_Test2" : 96,
"Unit_Test3" : 94,
"MidTerml" : 99,
"Annual" : 96
},
{
"subject_name" : "Science",
"Unit_Test1 " : 92,
"Unit_Test2" : 92,
"Unit_Test3" : 93,
"MidTerm" : 95,
"Annual" : 97
},
{
"subject_name" : "Maths",
"Unit_Test1 " : 96,
"Unit_Test2" : 94,
"Unit_Test3" : 93,
"MidTerm" : 95,
"Annual" : 99
},
}
student_info=Studentdb.db.Student.find_one({'username': current_user.username})
期待这样的结果:
对于特定用户(匹配用户名),匹配诸如subjects.subject_name之类的主题,一旦学生和主题名称匹配,就可以使用相同的相应分数并计算每个单独测试的总分Unit_Test1,Unit_Test2,Unit_Test3,MidTerm , 所有科目每年一次
解决方案
好的。您的请求返回一个字典,这非常好:
>>> student_info = {'_id': 'Grade01', 'user_name': 'TestUser', 'status': 'active', 'subjects': [{'subject_name': 'Computer', 'Unit_Test1 ': 95, 'Unit_Test2': 96, 'Unit_Test3': 94, 'MidTerml': 99, 'Annual': 96}, {'subject_name': 'Science', 'Unit_Test1 ': 92, 'Unit_Test2': 92, 'Unit_Test3': 93, 'MidTerm': 95, 'Annual': 97}, {'subject_name': 'Maths', 'Unit_Test1 ': 96, 'Unit_Test2': 94, 'Unit_Test3': 93, 'MidTerm': 95, 'Annual': 99}]}
>>> student_info['subjects']
[{'subject_name': 'Computer', 'Unit_Test1 ': 95, 'Unit_Test2': 96, 'Unit_Test3': 94, 'MidTerml': 99, 'Annual': 96}, {'subject_name': 'Science', 'Unit_Test1 ': 92, 'Unit_Test2': 92, 'Unit_Test3': 93, 'MidTerm': 95, 'Annual': 97}, {'subject_name': 'Maths', 'Unit_Test1 ': 96, 'Unit_Test2': 94, 'Unit_Test3': 93, 'MidTerm': 95, 'Annual': 99}]
>>> student_info['subjects'][0]
{'subject_name': 'Computer', 'Unit_Test1 ': 95, 'Unit_Test2': 96, 'Unit_Test3': 94, 'MidTerml': 99, 'Annual': 96}
>>> student_info['subjects'][0]['subject_name']
'Computer'
这个命令行小练习展示了如何访问字典中的每条信息。
现在是动态管理所有这些的代码
student_info = {'_id': 'Grade01', 'user_name': 'TestUser', 'status': 'active', 'subjects': [{'subject_name': 'Computer', 'Unit_Test1 ': 95, 'Unit_Test2': 96, 'Unit_Test3': 94, 'MidTerml': 99, 'Annual': 96}, {'subject_name': 'Science', 'Unit_Test1 ': 92, 'Unit_Test2': 92, 'Unit_Test3': 93, 'MidTerm': 95, 'Annual': 97}, {'subject_name': 'Maths', 'Unit_Test1 ': 96, 'Unit_Test2': 94, 'Unit_Test3': 93, 'MidTerm': 95, 'Annual': 99}]}
subjects = student_info['subjects']
result = {}
for i in subjects:
total = 0
one_subject = ''
for key, value in i.items():
if key == 'subject_name':
one_subject = value
else:
total += int(value)
result[one_subject] = total
print(result)
此代码生成一个字典,其中以不同主题作为键,将每个单独测试的总和作为值。结果给出:
{'Computer': 480, 'Science': 469, 'Maths': 477}
推荐阅读
- java - Android - Is it ok to register a reciever multiple times?
- android - 无法使用离子 codova 制作 .apk
- javascript - Chrome 开发者工具无法检测清单
- c - 当我尝试打印 getenv() 输出时,为什么会出现分段错误?
- c - IRQ 表和地址
- angular - 如何使用 Angular 2 中的指令删除组件
- java - 如何检查元素何时在 Selenium 中将其状态从启用更改为禁用
- html - Only controls and audio load and work on video in chrome
- html - React use different value of input field than it is showing
- git - What are the programming languages used to develop a GitHub App or an OAuth App?