mongoDB + mongoose:为分层数据选择正确的模式

时间:2014-02-18 13:30:11

标签: node.js mongodb mongoose

我是mongoDB的新手,在一个节点项目中,我正在使用mongoose为我的数据库创建一个模式。我已经明白,在我的情况下,我应该使用嵌入数据而不是引用。 (http://docs.mongodb.org/manual/core/data-modeling-introduction/

我需要存储在数据库中的结构是这样的:

  • |标题
  • | |章
  • | | | content(url to a html file)

来自mySQL世界,我正在尝试理解noSQL数据库概念,我想知道如何设计mongoose模式。

THX,

2 个答案:

答案 0 :(得分:1)

首先看一下这个Martin Fowlers excellent video

我认为没有更好的权威可以解释nosql,然后福勒。特别是了解他的sql背景。

其次,MongoDB遵循json架构。如果您知道如何使用json,您将知道如何使用nosql(mongodb)。需要理解的基本事情是Mongo模式以使用它的语言表达。 因此,如果您将NodeJS与Mongo一起使用,您仍然可以使用对象和数组。简单来说,Mongo并没有强制任何特定的架构。开发人员根据他的语言/ mongo驱动程序创建他的方案。

那么您如何用您的语言表达数据逻辑?如果是JS对象的形式,则将该表单移动到db。

我非常喜欢MongoDB,因为它可以与一些优秀的JS工具结合使用,例如 Underscore.js ,用于所有类型的数据操作。

答案 1 :(得分:1)

您可以嵌套文档,并在MongoDB文档中记录数组:

db.books.findOne();

可以返回JSON:

{
  isbn:"253GHST78F6",
  title:"some book",
  author:"Earnest Hemmingway",
  chapters:[
   {title:"chapter 1",content:"http://api.com/chapters/1.html"},
   {title:"chapter 2",content:"http://api.com/chapters/2.html"}
  ]
}

但是,在MongoDB中对集合进行建模时,还需要记住一些事项:

  1. 尽可能接近要求的模型数据:MongoDB中没有 Joins ,因此,请尝试将所有此类数据保存在一起(预加入)< / em>,这应该在将来一起被查询。

  2. 嵌套适用于查询,但嵌套更新和搜索很糟糕:

    1. 对嵌套文档(尤其是数组)进行索引和搜索将非常昂贵。
    2. 避免在嵌套数组中放置任何数据,这是经常更新的。
  3. MongoDB中没有 Foriegn Keys 。因此,如果您拥有嵌套在不同集合下的同一文档的多个副本,那么保持所有更新都是您的责任。