Лучший способ получить встроенные документы в pymongo?

У меня в MongoDB такие документы:

{
"user": ObjectID("4d71076b26ab7b032800009f")
"pages" : [
    {
        "name" : "Main",
        "content" : [
            {
                "id" : ObjectId("4d71076b26ab7b052800009f")
            },
            {
                "id" : ObjectId("4d61269b1deb5a3fce000004"),
                "link" : "http://example.com"
            }
        ]
    }
]}

Вы можете видеть, что ключ "pages" представляет собой массив с другими документами. Теперь я могу запросить этот документ с именем страницы и получить полный документ со всеми страницами и другой информацией. Я использую в python напрямую pymongo для запроса документа, но теперь я не знаю, как лучше всего получить страницу из страниц массива. Я думаю примерно так:

def getPage(pageNameWhoINeed):
    for page in pages:
        if page['name'] == pageNameWhoINeed:
           return page

Но лучший ли это способ получить отдельную страницу или общий встроенный документ? Все подсказки или фрагменты кода приветствуются.

Спасибо! Ярус


person Jarus    schedule 05.03.2011    source источник


Ответы (2)


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

pages.find({"pages.name", "Main"}); //should load all document that contains pages  collection and at least one item in embedded collection with name 'Main'.

Затем вам нужно перебрать все встроенные документы и найти нужную страницу.

Если вам часто нужно загружать встроенный документ, мб вам нужно перепроектировать вашу базу данных (переместить страницы в корневую коллекцию, но мне кажется, что все в порядке с вашей схемой).

person Andrew Orsich    schedule 05.03.2011
comment
Согласно jira.mongodb.org/browse/SERVER-142, мы надеемся, что эта функция будет когда-то запекался в MongoDB, но в настоящее время не запланирован. На данный момент фильтрация вручную является лучшим подходом. - person Aea; 11.03.2011

Пожалуйста, прочитайте Получение подмножества полей в mongodb Веб-сайт.

Я надеюсь, что это поможет вам.

person Andrei Andrushkevich    schedule 09.03.2011
comment
Спасибо за ваш ответ, но мне не нужен первый или последний объект из массива. Мне нужен объект со специальным значением в одном из его ключей. И это я пока не смог построить с оператором $slice. Если я что-то не так понимаю, пожалуйста, поправьте меня. - person Jarus; 10.03.2011
comment
Вы можете получить частичные подобъекты через точечную нотацию. - person Andrei Andrushkevich; 10.03.2011