【问题标题】:ExpressJS: Getting associated posts, comments for a pageExpressJS:获取相关帖子、页面评论
【发布时间】:2016-07-18 11:29:58
【问题描述】:

假设我正在尝试建立一个博客。每个Page 有很多Posts,每个Post 有很多Comments。 我正在尝试从 Express/Mongo 服务器返回以下 JSON 输出。

page: {
  _id: <page_id>
  title: "page title"
  posts: [Post],
  comments: [Comment] // *Q2. notice comments are not nested under posts.
}

这是我尝试过的

.get((req, res) => {
  Page.findOne({title: req.params.title}, (err, page) => {
    if (err) { return res.json(err) }
    if (!page) { return res.json({error: "doesnt exist"}) }

    Post.find({page: page._id})
      .populate({ path: 'author'})
      .exec((err, posts) => {
        if (err) {
          return res.send(err)
        }

        const postIds = posts.map(post => post._id)
        Comment.find({post: {$in: postIds}}, (comments => {

          // FIXME
          res.json(Object.assign({},
            page.toObject(),
            posts,
            comments
          ))
        }))
      })
  })
})

我有几个问题。

第一季度。为什么我没有得到以下预期的输出?

          res.json(Object.assign({},
            page.toObject(),
            posts,
            comments
          ))

第二季度。我正在做三个不同的查询来返回单个页面的数据。这是违反惯例还是效率低下?人们通常会这样做吗? (我不是故意将 cmets 文档嵌入到 post 文档中)

Q3(可选)。我决定将postscomments规范化 格式返回,以便前端可以轻松制作状态树(Redux 推荐规范化应用程序状态树)。这是个坏主意吗?

【问题讨论】:

    标签: node.js mongodb express redux


    【解决方案1】:

    Q1:你正在混合一堆不同的东西来制作一种邪恶的混合物。 Posts 和 cmets 是一个数组,但 page 不是。 Object.assign(...) 获取这些东西的所有属性并将它们放在一个目标对象上。

    你会想要这样的东西:

    Object.assign({}, page.toObject, {
      posts: posts.map(p => p.toObject()),
      comments: comments.map(c => c.toObject())
    });
    

    Q2:Mongo 是一个文档存储,可以进行 3 次查询。也就是说,您可以将 cmets 存储在 post 文档中,并且每个 post 只需要 1 个查询。非规范化是文档/k/v/对象存储的规范。

    Q3:不,没关系。带有normalizr 的 Redux 更喜欢它。也就是说,Redux 哲学要求你必须始终做你认为最好的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2017-03-09
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多