我是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" } )
(做为在问题内编辑评论的另外一种方式)