Как получить значения (в реальном времени) документа PyMongo, который имеет встроенный массив пар ключ-значение - PullRequest
1 голос
/ 13 июня 2019
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, Year и суммировать их по всем предметам

Если нет списков, подобных темам, легко получить с помощью 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, Year для всех субъектов

1 Ответ

1 голос
/ 13 июня 2019

Хорошо. Ваш запрос возвращает словарь, который отлично:

>>> 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...