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

(做为在问题内编辑评论的另外一种方式)

相关文章
相关标签/搜索