【问题标题】:mongoDB + mongoose: choosing the right schema for hierarchical datamongoDB + mongoose:为分层数据选择正确的模式
【发布时间】:2014-03-18 07:13:10
【问题描述】:

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

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

  • |标题
  • | |章节
  • | | |内容(指向 html 文件的 URL)

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

谢谢,

【问题讨论】:

  • 这可能会受益于您提供的更多关于某些建议模式格式的内容。然后实际询问每个人的“利弊”,同时给出一些你的用法示例。看起来这就是你想要的。目前,这个问题有点过于宽泛了。有人可能会关闭它。不要害羞并编辑
  • 谢谢,我会尽快编辑我的帖子。

标签: node.js mongodb mongoose


【解决方案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,因此,请尝试将所有此类数据放在一起 (预连接),以后应该会一起查询。

  2. 嵌套对查询有好处,但嵌套更新和搜索不好:

    1. 在嵌套文档(尤其是数组)中进行索引和搜索会很昂贵。
    2. 避免将任何数据放在嵌套数组中,因为这种数组更新非常频繁。
  3. MongoDB 中没有 外键。因此,如果您将同一文档的多个副本嵌套在不同的集合下,则保持所有副本的更新是您的责任。

【讨论】:

  • 如果嵌套搜索不好并且没有真正的关系(例如在关系数据库中),那么我是否会创建一个新集合,以便更容易获得 x 作者的所有书籍,或者可以我只是查询上面的架构?
  • @kevinius 是的,您可以通过 ObjectId 在集合之间进行链接。
【解决方案2】:

先看看这个Martin Fowlers excellent video

我觉得没有更好的权威可以解释nosql,然后是Fowler。尤其了解他的sql背景。

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

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

我真的很喜欢 MongoDB,因为它可以与一些出色的 JS 工具(如 Underscore.js)结合使用,用于各种数据操作。

【讨论】:

  • 谢谢这部电影,我刚看了,很棒的发现。
  • 很高兴为您提供帮助 - 如果您喜欢,请接受答案:)
猜你喜欢
  • 2018-10-18
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多