带有 ObjectID 引用的 RESTful Mongoose

Posted

技术标签:

【中文标题】带有 ObjectID 引用的 RESTful Mongoose【英文标题】:RESTful Mongoose with ObjectID references 【发布时间】:2014-03-18 22:59:59 【问题描述】:

我的问题:我怎样才能拥有一个使用 mongoosejs 的 RESTful mongodb 实例而不发出一百万个 http 请求?

我的设置:我使用NodeJS 和MongooseJS 作为后端。我在前端使用AngularJS,所以我决定使用angular-bridge 重新调整我的MongoDB 数据库。

我的架构:我有以下架构:

注意:箭头的开头表示该对象对箭头末尾的对象有一个引用(例如,comment 有一个owningPost 属性,即@987654329 @参考帖子)。此外,星号 (*) 表示“许多”,因此,一个帖子可以有多个 cmets,但一条评论只引用一个帖子,一个流可以引用多个存储桶,一个存储桶可以有多个流引用它。

问题:假设用户点击代表存储桶的页面。我需要发出以下获取请求:

    桶 用户 引用存储桶的每个帖子 引用帖子的每条评论 每条评论的用户

请求的数量可能会迅速增加。也许我可以在帖子中包含评论,这可能不是问题。但是,我不能对其他所有事情都这样做(并保持清醒)。

我尝试创建一个端点来获取不同属性中的所有数据,例如:

data: 
  bucket: ,
  user: ,
  posts: [
    
      post: ,
      comments: [
        user: ,
        comment: 
      ]
    
  ]

但是这样就不再平静了……对吧?这使得更新内容有点困难。

我做错了什么?有什么更好的方法来做到这一点?

【问题讨论】:

如果您的数据和需求符合关系模型,您可以考虑使用关系数据库而不是 MongoDB。 【参考方案1】:

我通常做的是:

我没有在“列表”请求中填充任何内容。 我在“显示”请求中填充所有 objectId 引用。

就我而言,这不会降低您的服务的 RESTful 风格。它仍然是面向资源的,并且附加的数据实际上属于该特定资源。这应该会减少您需要提出的请求数量。

或者,您可以创建一个容器资源来收集所有必需的信息并将其发送回客户端。不过,我个人会提出几个单独的请求。特别是因为,从 HTTP 1.1 开始,多个请求可以通过同一个连接执行。我认为同时请求多个 JSON 对象不会对您的应用程序的性能产生任何重大影响。

不过,我不会将所有内容都嵌套在“数据”架构中。

希望对您有所帮助,祝您好运!

【讨论】:

我越想这个想法,我就越喜欢它。我想我会去的。我会在我尝试过以及结果如何时告诉你。 @kentcdodds 很高兴你喜欢这个主意,是的,请这样做! 好的,这很好用。即使我没有完全同意您的实施,您确实帮助我克服了这个问题。我所做的是在获取流的帖子时实际上确实返回了一个“数据”对象,但是我为适当的数据创建了一个 $resource 对象,然后简单地将该对象附加到它所属的资源上。无论如何,这不会持久化到数据对象。所以,基本上,当我加载一篇文章时,它有一个 cmets 属性,所以我为每一个创建/替换一个资源,然后我对评论的作者做同样的事情。这样我就可以得到安宁的好处,并减少请求。【参考方案2】:

对我来说,这更像是一个面向文档的数据设计问题,而不是 REST 设计问题。我的方法是通过视图或页面来驱动数据模型的设计,而不是先设计模型然后尝试使视图适应它。这在某种程度上与 Reda 的答案一致。

为了减少请求或猫鼬种群的数量,我总是允许文档中的重复。在您的示例中,存储桶将具有一组帖子 ID 和一组流 ID。同时,一个帖子会有一组桶的ID,甚至是每个桶的一些详细信息。这样的设计会使文档的检索速度非常快,但会减慢更新操作,同时也会引入不一致的风险。

【讨论】:

【参考方案3】:

你应该非规范化你的架构

【讨论】:

我意识到规范化模式不是“MongoDB 方式”,但您如何建议在没有规范化模式的情况下表示多对多关系? 我会将网页上显示的所有数据存储在一个文档中 我想我在解释我如何使用这些数据方面做得不够好。因为一个帖子可以在多个存储桶中,而一个存储桶可以有多个帖子,您建议将另一个存储在哪个文档中?无论哪种方式都没有意义……至少对我来说不是。我错了吗? 您仍在用关系术语进行推理。你的用例是什么?您如何显示和编辑这些数据? 你考虑过关系数据库吗?所有数据库都有其适当的用例。

以上是关于带有 ObjectID 引用的 RESTful Mongoose的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个包含另一个集合的 ObjectId 数组的文档(最佳实践,RESTful)?

为啥使用 MongoDB 的 $push 将新对象添加到数组时添加了带有 ObjectID 的 _id?

创建一个引用集合的 ObjectId 的文档

带有 casbah 的 scala 案例类。接受 objectid 参数作为字符串或 objectid

Mongoose 存储另一个集合的 ObjectId 的引用

如何将子文档数组的 ObjectId 引用到另一个模型