我是MongoDB的新手-來自關係數據庫背景。 我想設計一個帶有一些註釋的問題結構,可是我不知道該使用哪一種關係進行註釋: embed
仍是reference
? html
一個帶有一些註釋的問題,例如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
讓我找到它的問題。 (我是如此的新手,不知道沒有_id
和question_ref
是否有任何方法能夠實現。) 數據庫
我必須使用ref
not embed
嗎? 而後,我必須建立一個新的評論集嗎? 架構
我知道這已經很老了,可是若是您正在尋找OP的有關如何僅返回指定註釋的問題的答案,則可使用$(query)運算符,以下所示: mongoose
db.question.update({'comments.content': 'xxx'}, {'comments.$': true})
好吧,我有點遲了,但仍然想分享個人架構建立方式。 ui
我有一個能夠用一個詞描述的全部事物的模式,就像您在經典OOP中所作的那樣。 spa
例如 設計
每一個模式均可以另存爲文檔或子文檔,所以我爲每一個模式聲明瞭這一點。 code
文獻:
子文件:
是的,咱們可使用文檔中的引用。就像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
一般,若是實體之間具備一對一或一對多的關係,則嵌入是好的;若是您具備多對多的關係,則引用是好的。
若是要編輯指定的註釋,如何獲取其內容和問題?
若是您一直跟蹤要更改的評論數和評論的索引,則可使用點運算符 ( SO示例 )。
你能夠作f.ex.
db.questions.update( { "title": "aaa" }, { "comments.0.contents": "new text" } )
(做爲在問題內編輯評論的另外一種方式)