Sequelize中的高效查询

时间:2016-06-28 15:25:31

标签: javascript node.js express sequelize.js

我正在实施一个受IP限制的post upvote系统。到目前为止,提交单个帖子的路由包含4个总查询,以完成这些步骤:

  1. 查找已存在的具有相同PostId和IP的upvote,如果存在则失败
  2. - 否则 -

    1. 创建一个upvote
    2. 找到与upvote关联并关联它们的帖子。
    3. 最后重新获取帖子以包含刚刚关联的upvote。
    4. 我觉得最后两个步骤可以组合在一起,但是如果我在将upvote关联到它之后返回帖子,那么它不包括在内是有意义的,因为当发现它没有关联的upvote时。这就是我现在拥有的东西,我认为单一的upvote效率非常低。

      router.get('/posts/:id/upvote', function(req, res) {
          var id = req.params.id;
          var query_options = {
              where: {
                  id: id
              },
              include: common_includes
          };
      
          // Look for already existing upvote with same PostId and IP.
          Upvote.findOne({ where: { ip: req.ip, PostId: id }}).then(function(upvote) {
              if (upvote !== null) return res.fail('Already upvoted');
      
              // No upvote exists, create one
              Upvote.create({
                  ip: req.ip
              }).then(function(upvote) {
                  // Find post to associate upvote with
                  Post.findOne({ where: { id: id }}).then(function(post) {
                      // Associate upvote to post
                      upvote.setPost(post).then(function() {
                          // Query again to get updated post to be returned
                          Post.findOne(query_options).then(function(post) {
                              return res.pass(formatPost(post));
                          }).error(function(err) {
                              console.log(err);
                              return res.fail('Server error');
                          });
                      }).error(function(err) {
                          console.log(err);
                          return res.fail('Server error');
                      });
                  }).error(function(err) {
                      console.log(err);
                      return res.fail('Server error');
                  });
              }).error(function(err) {
                  console.log(err);
                  return res.fail('Server error');
              });
          });
      });
      

1 个答案:

答案 0 :(得分:0)

可能会有帮助http://docs.sequelizejs.com/en/latest/docs/associations/#creating-with-associations

但恕我直言,你可以将第2步和第3步结合起来:

    Upvote.create({
        ip: req.ip,
        PostId: id
    })

然后获取新帖子