MongoDB關係:嵌入仍是引用?

我是MongoDB的新手-來自關係數據庫背景。 我想設計一個帶有一些註釋的問題結構,可是我不知道該使用哪一種關係進行註釋: embed仍是referencehtml

一個帶有一些註釋的問題,例如stackoverflow ,將具備如下結構: sql

Question
    title = 'aaa'
    content = bbb'
    comments = ???

起初,我想使用內嵌的意見(我認爲embed在MongoDB的建議),就像這樣: mongodb

Question
    title = 'aaa'
    content = 'bbb'
    comments = [ { content = 'xxx', createdAt = 'yyy'}, 
                 { content = 'xxx', createdAt = 'yyy'}, 
                 { content = 'xxx', createdAt = 'yyy'} ]

顯而易見,但我擔憂這種狀況: 若是要編輯指定的註釋,如何獲取其內容和問題? 沒有_id讓我找到一個,也沒有question_ref讓我找到它的問題。 (我是如此的新手,不知道沒有_idquestion_ref是否有任何方法能夠實現。) 數據庫

我必須使用ref not embed嗎? 而後,我必須建立一個新的評論集嗎? 架構


#1樓

我知道這已經很老了,可是若是您正在尋找OP的有關如何僅返回指定註釋的問題的答案,則可使用$(query)運算符,以下所示: mongoose

db.question.update({'comments.content': 'xxx'}, {'comments.$': true})

#2樓

好吧,我有點遲了,但仍然想分享個人架構建立方式。 ui

我有一個能夠用一個詞描述的全部事物的模式,就像您在經典OOP中所作的那樣。 spa

例如 設計

  • 評論
  • 賬戶
  • 用戶
  • 網誌文章
  • ...

每一個模式均可以另存爲文檔或子文檔,所以我爲每一個模式聲明瞭這一點。 code

文獻:

  • 能夠做爲參考。 (例如,用戶發表評論->評論對用戶的引用是「製造者」)
  • 是您應用程序中的「根」。 (例如,博客->有關於博客的頁面)

子文件:

  • 只能使用一次/永遠不能做爲參考。 (例如,評論保存在博客文章中)
  • 在您的應用程序中永遠都不是「根」。 (該評論僅顯示在博客文章頁面中,但該頁面仍與博客文章有關)

#3樓

是的,咱們可使用文檔中的引用。就像sql i joins同樣填充另外一個文檔。在mongo db中,它們沒有映射到多對多關係文檔的聯接,而是可使用填充來實現咱們的方案。

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

var personSchema = Schema({
  _id     : Number,
  name    : String,
  age     : Number,
  stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});

var storySchema = Schema({
  _creator : { type: Number, ref: 'Person' },
  title    : String,
  fans     : [{ type: Number, ref: 'Person' }]
});

填充是用其餘集合中的文檔自動替換文檔中指定路徑的過程。 咱們能夠填充單個文檔,多個文檔,純對象,多個純對象或查詢返回的全部對象。 讓咱們看一些例子。

更好的是您能夠得到更多信息,請訪問: http : //mongoosejs.com/docs/populate.html


#4樓

一般,若是實體之間具備一對一或一對多的關係,則嵌入是好的;若是您具備多對多的關係,則引用是好的。


#5樓

若是要編輯指定的註釋,如何獲取其內容和問題?

若是您一直跟蹤要更改的評論數和評論的索引,則可使用點運算符SO示例 )。

你能夠作f.ex.

db.questions.update(
    {
        "title": "aaa"       
    }, 
    { 
        "comments.0.contents": "new text"
    }
)

(做爲在問題內編輯評論的另外一種方式)

相關文章
相關標籤/搜索