Как сделать запрос во вложенном массиве. (Используя pymongo) - PullRequest
1 голос
/ 11 сентября 2011

Я новая пчела в mongodb.Я создал документ с вложенным массивом, как этот.

data = {
    "title": "mongo community",
    "description": "I am a new bee",
    "topics": [{
        "title": "how to find object in array",
        "comments": [{
            "description": "desc1"
        }]
    },
    {
        "title": "the case to use ensureIndex",
        "comments": [{
            "description": "before query"
        },
        {
            "description": "If you want"
        }
        ]
    }
    ]
}

, после этого поместил его в "сообщество" db.community.insert (data)

, поэтому я хотел бы накопить "комментарии "название темы" как найти объект в массиве ", затем я попытался,

data = db.community.find_one ({" title ":" сообщество монго "," темы.title ":" как найти объект в массиве "})

результат -

>>> print data
{
    u 'topics': [{
        u 'comments': [{
            u 'description': u 'desc1'
        }],
        u 'title': u 'how to find object in array'
    },
    {
        u 'comments': [{
            u 'description': u 'before query'
        },
        {
            u 'description': u 'If you want'
        }],
        u 'title': u 'the case to use ensureIndex'
    }],
    u '_id': ObjectId('4e6ce188d4baa71250000002'),
    u 'description': u 'I am a new bee',
    u 'title': u 'mongo community'
}

Мне не нужны темы" случай использованияureIndex "

Не могли бы вы дать мне какой-нибудь совет.

thx.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Похоже, вы встраиваете темы в виде массива в одном документе.Вам следует избегать частого возврата частичных документов из MongoDB.Вы можете сделать это с помощью аргумента «fields» метода find, но с ним не очень легко работать, если вы делаете это часто.

Так что для решения этой проблемы вы можете попробовать создать каждую темуотдельный документ.Я думаю, что это будет проще для вас.Если вы хотите сохранить информацию о «сообществе» для форума, поместите ее в отдельный сборник.Например, вы можете использовать следующее в оболочке monbodb:

// ad a forum:
var forum = { 
                title:"mongo community",
                description:"I am a new bee"
            };
db.forums.save(forum);

// add first topic:
var topic = {
                title: "how to find object in array",
                comments: [ {description:"desc1"} ],
                forum:"mongo community"
            };
db.topics.save(topic);

// add second topic:
var topic = {
                title: "the case to use ensureIndex",
                comments: [ 
                    {description:"before query"},
                    {description:"If you want"}
                ],
                forum:"mongo community"
            };
db.topics.save(topic);

print("All topics:");
printjson(db.topics.find().toArray());


print("just the 'how to find object in array' topic:")
printjson(db.topics.find({title:"how to find object in array"}).toArray());

Также см. Документ Деревья в MongoDB о разработке схемы в MongoDB.Это происходит с использованием схемы, аналогичной той, с которой вы работаете, и расширяет ее для более сложных вариантов использования.

0 голосов
/ 12 сентября 2011

MongoDB работает с документами, то есть с документами верхнего уровня (то, что вы save, update, insert, find и find_one включены). Язык запросов Mongo позволяет выполнять поиск во встроенных объектах, но всегда будет возвращать, обновлять или манипулировать одним (или несколькими) из этих документов верхнего уровня.

MongoDB часто называют «без схемы», но более точным описанием будет нечто более похожее на «(имеет) гибкие схемы» или «(имеет) схемы для каждого документа». Это тот случай, когда ваш дизайн схемы, включающий темы, встроенные непосредственно в сообщество, не работает для этого конкретного запроса. Однако, возможно, существуют другие запросы, которые эта схема поддерживает более эффективно, например, перечисление тем в сообществе в одном запросе. Возможно, вы захотите рассмотреть запросы, которые вы хотите сделать, и соответствующим образом изменить свою схему.

Несколько замечаний об ограничениях MongoDB:

  1. документы верхнего уровня всегда возвращаются (опционально только с подмножеством полей, как заметил @scott - см. документы mongodb по этой теме)
  2. каждый документ ограничен 16 мегабайтами данных (начиная с версии 1.8+), поэтому эта схема не будет работать, если у сообществ длинный список тем

Для получения справки по проектированию схемы см. документы mongodb по проектированию схемы , Видео Кайла Бэнкера "Основы проектирования схемы" и Видео Элиота Горовица "Разработка схемы в масштабе" « за введение, советы и рекомендации.

...