首页 > 解决方案 > 如何获取具有嵌入式键值对数组的 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 , 所有科目每年一次

标签: pythonmongodbflask

解决方案


好的。您的请求返回一个字典,这非常好:

>>> 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}

推荐阅读