Создание сложного дерева в MongoDB и запрос данных - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь сделать что-то подобное в MongoDB:

wiki_db
   |
   +-- Programming --+
                     |
                     |
                     +-- Perl -+
                               |
                               +-- tutorials --+
                                               |
                                               +-- 1 --+
                                                       |
                                                       |      +---- id      = 1
                                                       |      |
                                                       +------+---- title   = Introdaction To Perl
                                                              |
                                                              +---- Date    = 12/11/2100
                                                              |
                                                              +---- Content = "Perl is .... "

Это небольшая база данных для вики-приложения. Я планирую написать ее на Perl, которая:

  • wiki_db: это база данных.
  • программирование: основной раздел.
  • perl: это подраздел.
  • учебники: это тема.
  • 1: номер страницы.

Как дерево. Итак, я написал этот код для его описания:

programming = {
    'perl': {
        'tutorials': {
            '1': {
                'id':'1',
                'title':'Hello World!',
                'lastmod':'Sat Jul 23 14:56:22 AST 2011',
                'Content': 'Hello!, This is the first page in the tutorial.'
            }
        }
    }
}

Проблема в том, что когда я делаю какой-то запрос, он ничего не возвращает:

$ mongo
MongoDB shell version: 1.8.2
connecting to: test
> use wiki
switched to db wiki
> show collections
programming
system.indexes
> db.programming.findOne()
{
    "_id" : ObjectId("4e2f2fadce7012941395b103"),
    "perl" : {
        "tutorials" : {
            "1" : {
                "id" : "1",
                "title" : "Hello World!",
                "lastmod" : "Sat Jul 23 14:56:22 AST 2011",
                "Content" : "Hello!, This is the first page in the tutorial."
            }
        }
    }
}
> db.programming.find({"perl":{"tutorials":{"1":{"id":"1"}}}})
> 

Как правильно написать запрос? а дизайн дерева хорош? Я имею в виду, будет ли этот дизайн замедлять работу базы данных, когда она будет расти?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Сделайте это:

> db.programming.find({'perl.tutorials.1.id': '1'})
{ "_id" : ObjectId("4e2f45ef55bf6c17a7f511e0"), "perl" : { "tutorials" : { "1" : { "id" : "1", "title" : "Hello World" } } } }
1 голос
/ 27 января 2012

Учебники могут быть вместо этого массивом:

programming = {
    'perl': {
        'tutorials': [
            {
                'id':'1',
                'title':'Hello World!',
                'lastmod':'Sat Jul 23 14:56:22 AST 2011',
                'Content': 'Hello!, This is the first page in the tutorial.'
            }
        ]
    }
}

Затем можно выполнить поиск следующим образом:

db.programming.find({'perl.tutorials.id': '1'})

Однако , в зависимости от того, сколько учебникову вас есть по теме, и как долго они, эта модель вполне может достичь 16 МБ на лимит документа.Я бы предложил разделить учебники в их собственную коллекцию и использовать теги для их уточнения следующим образом:

db.tutorials.save({
                "title" : "Hello World!",
                "lastmod" : "Sat Jul 23 14:56:22 AST 2011",
                "Content" : "Hello!, This is the first page in the tutorial.",
                "Tags":['perl']
            });

Тогда вы можете найти вот так:

db.tutorials.find({Tags:'perl'});

Это предотвратит попадание вОграничение до 16 МБ и делает вашу модель более гибкой. См. Деревья в MongoDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...