2011-07-26 2 views
1

Я пытаюсь сделать что-то подобное в MongoDB:Создание сложного дерева в MongoDB и запрашивая The Data

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

ли это:

> db.programming.find({'perl.tutorials.1.id': '1'}) 
{ "_id" : ObjectId("4e2f45ef55bf6c17a7f511e0"), "perl" : { "tutorials" : { "1" : { "id" : "1", "title" : "Hello World" } } } } 
1

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

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'}) 

Однако, в зависимости от сколько у вас учебников по теме, и как долго они это делают, этот мод el может очень сильно ударить по 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'}); 

Это предотвратить бы ударяя предел 16MB DOC и сделайте вашу модель немного более гибкой. See Trees in MongoDB

Смежные вопросы