具有ObjectID引用的RESTful Mongoose

时间:2014-02-18 22:07:19

标签: node.js mongodb angularjs rest mongoose

我的问题:我如何拥有一个RESTful mongodb实例,该实例使用mongoosejs而不会产生一百万个http请求?

我的设置:我正在使用NodeJS作为后端MongooseJS。我在前端使用AngularJS,因此我决定使用angular-bridge来解析我的MongoDB数据库。

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

Schemas

注意:箭头的开头表示该对象在箭头末尾有对象的引用(例如,comment具有owningPost属性是ObjectID对帖子的引用)。此外,星号(*)表示“很多”,因此,帖子可以有很多注释,但注释只引用一个帖子,一个流可以引用许多桶,一个桶可以有许多引用它的流。

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

  1. 铲斗
  2. 用户
  3. 每个引用存储桶的帖子
  4. 每篇引用帖子的评论
  5. 每条评论的用户
  6. 请求数量可能会迅速爆炸。也许我可以在帖子中包含评论,这可能不是问题。但是,我不能为其他一切做到这一点(并保持理智)。

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

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

    然而它不再宁静......对吗?它使更新内容有点困难。

    我做错了什么?有什么更好的方法呢?

3 个答案:

答案 0 :(得分:2)

我通常做的是:

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

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

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

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

希望它有所帮助,祝你好运!

答案 1 :(得分:1)

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

为了减少请求或猫鼬群体的数量,我总是允许文档中的重复。在您的示例中,存储桶将包含一个post id和一系列stream id。同时,一个帖子将有一系列桶的ID,甚至每个桶的一些详细信息。这样的设计将非常快速地检索文档,但是减慢了更新操作,并且还引入了不一致的风险。

答案 2 :(得分:0)

你应该对你的架构进行非规范化