Как получить вложенные документы в массиве из mongoDB с помощью скрипта python

Я новичок в python и mongoDB, и мне нужно выполнить эту задачу.

У меня есть коллекция, содержащая документы, подобные образцу ниже.

{
        "_id" : 1900123,
        "name" : "AAAAA BBBB",
        "scores" : [
                {
                        "type" : "exam",
                        "score" : 44.51211101958831
                },
                {
                        "type" : "quiz",
                        "score" : 0.6578497966368002
                },
                {
                        "type" : "projectwork",
                        "score" : 93.36341655949683
                },
                {
                        "type" : "projectwork",
                        "score" : 49.43132782777443
                }
        ]
}

Я пытаюсь прочитать эту коллекцию в сценарии Python. Я не могу получить оценку из поддокумента

cursor = students.find()

for doc in cursor:
        score1=doc["scores.2.score"];
        print("score1=",score1);

Я пытаюсь найти самый низкий балл за проектную работу для каждого учащегося, но не могу получить балл, используя индекс "scores.2.score".

Нужна помощь, чтобы понять метод поиска.


person Kfactor21    schedule 22.01.2015    source источник


Ответы (1)


Метод find pymongo внутренне использует db.collections.find, который фактически возвращает курсор. При повторении курсора вы получите отдельные документы. Возвращенные документы будут представлены в Python как словарь. Итак, в данном случае doc — это словарь. Когда вы делаете

doc["scores.2.score"]

вы пытаетесь получить элемент, соответствующий ключу scores.2.score в словаре doc. Но, как вы видите из структуры, показанной в вопросе, такого ключа с именем scores.2.score не существует. На самом деле, когда вы делаете

doc["scores"]

ты получишь

[
    {
        "type": "exam",
        "score": 44.51211101958831
    },
    {
        "type": "quiz",
        "score": 0.6578497966368002
    },
    {
        "type": "projectwork",
        "score": 93.36341655949683
    },
    {
        "type": "projectwork",
        "score": 49.43132782777443
    }
]

который является списком, и чтобы получить из него второй элемент, вы сделаете

doc["scores"][2]

который даст вам словарь

    {
        "type": "projectwork",
        "score": 93.36341655949683
    }

и чтобы получить доступ к score в нем, вы сделаете

doc["scores"][2]["score"]

и это на самом деле даст вам

93.36341655949683.
person thefourtheye    schedule 22.01.2015