2012-03-09 196 views
1

我真的是新來的MongoDb,並與nodeJS和本地節點mongodb驅動程序一起使用它。我對執行有懷疑。我希望你能幫助我: 我有這樣的「模式」,其中db.pages擁有的配置,我的網站的每個部分:Mongo DB - 子集合?

db.pages = [ 
    {name: 'contacts', settings:{...}}, 
    {name: 'blog', settings:{...}, posts: "blogPosts"}, 
    {name: 'media', settings: {...}, posts: "mediaPosts"} 
] 

db.blogPosts = [ 
    {title: 'post1', date: '2011-10-22', author:'me', content: '...'}, 
    {title: 'post2', date: '2011-11-22', author:'me', content: '...'}, 
    {...............................................................} 
]; 

什麼,我就是在這裏做,在每一頁上,我定義如果我有帖子集合,並且在節點中加載頁面時,我檢查是否定義了page.posts,如果是,則加載相應的集合。

也許我錯了,但這種期待太多,因爲關係的事情,所以,我的想法,將 放blogPosts內容直接作爲pages收集的道具posts,像這樣的價值:

db.pages = [ 
     {name: 'contacts', settings:{...}}, 
     { name: 'blog', 
     settings:{...}, 
     posts: [ 
      {title: 'post1', date: '2011-10-22', author:'me', content: '...'}, 
      {title: 'post2', date: '2011-11-22', author:'me', content: '...'}, 
      {...............................................................} 
     ] 
     }, 
     {name: 'media', settings: {...}, posts: [...]} 
    ] 

我真的認爲這更有道理,在NoSQL的環境,但我可能是錯的。 我遇到的問題是使用後一種配置,我似乎無法讓nodejs將posts字段視爲mongo集合。

我希望這是任何意義,你,如果是這樣,我需要知道的是:

  1. 我說得對還是錯認爲第二種方式是正確的方式?
  2. 我如何使用節點讀取「子集」爲收集這樣我就可以申請一個光標,使用find()sort()limit()skip()等,它...

回答

5

第一種方法是更好。第二種方法有多種缺點:

  1. 每個文檔的大小限制爲16MB。如果你應用這個原則,那麼你將達不到這個限制,並且將無法添加更多的博客文章。
  2. 如果你應用這個原則,你將無法從磁盤上查詢和獲取單個博客文章評論也在同一頁面的文件,進一步複雜化,將鬆散很大的靈活性
+0

謝謝,我明白了第1點和第3點。我不知道你的第二點是否是我的第二個問題的答案。我仍然不知道,如果我可以將收藏的子收藏作爲第一級收藏。 – 2012-03-09 15:12:52

+0

您可以使用find(),但sort(),limit(),skip()適用於文檔。例如,在第二種方法中,您不能選擇最新的5篇博文。你可以找到5頁有最新的博客文章,但將不得不在這5頁的所有博客文章。 – 2012-03-09 15:28:32

+0

好吧,我幾乎明白了。只是最後一個問題:無論如何,在運行時,我可以:選擇一個頁面,將文章集合在文檔中? – 2012-03-09 15:33:24