每次查看页面时尝试将其递增1

时间:2018-08-21 09:51:46

标签: javascript node.js mongoose mongoose-schema

我试图弄清楚如何通过每次访问该页面时增加+1来更新该字段,如果从未访问过该页面,则将其添加到数据库中。

目前,这是我所拥有的,但似乎并不能做很多事情。我一定在某个地方出错了,我还没有实现那一部分,如果从未浏览过该页面,那么在存储在数据库中的数组中创建一个新对象。

小注释:在我创建地图的地方,如果我查看与数据库中存储的ID相同但没有增量的页面,它们确实具有相同的ID。

exports.pageVisitCount = (req, res, next) => {
  User.findById({
    _id: req.userData.userId
  }, 'visits', function (err, pageVists) {
    if (err) {
      res.status(401).json({
        message: "Error Occured!"
      })
    } else {
      const pageCounts = pageVists.visits;
      pageCounts.map(page => {
        const postViewed = req.body.postId;
        if (page.postId.toString() === postViewed) {
          User.findByIdAndUpdate({
              _id: req.userData.userId
            }, {
              $set: {
                visits: [{
                  "postId": postViewed,
                  $inc: { visitCount: 1 }
                }]
              }
            }, {
              upsert: false
            },
            (err) => {
              if (err) {
                res.status(401).json({
                  message: "Error Occured!"
                })
              } else {
                res.status(200).json({
                  message: "Update successful!"
                })
              }
            });
        }
      });
    }
  });
}

这是我正在使用的架构:

const visitsSchema = new Schema ({
  postId: {
    type: String
  },
  visitCount: {
    type: Number
  }
})

const userSchema = mongoose.Schema({
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true
  },
  role: {
    type: String,
    required: true
  },
  answers: {
    type: String
  },
  visits: [visitsSchema]
});

任何反馈将不胜感激,我想提及一下我是后端新手,谢谢!

1 个答案:

答案 0 :(得分:1)

为避免在查询正在考虑的用户visits之后使用地图过滤visits,建议您让mongodb为您完成此操作。在这种情况下,您首先要根据用户ID和postId进行查找。如果您获得的记录符合这两个条件,那么您可以确定,可以通过将特定的visits visitCount加1来轻松地更新用户访问。

否则,如果它们与任何记录都不匹配,则由于您可能使用了有效的用户ID,则该用户尚未访问过该帖子。因此,您现在使用postId创建一个新访问并将其visitCount初始化为1(尽管我们打算创建,但是由于它是一个子文档,因此您需要使用$push)。足够多的谈话尝试下面的代码。

exports.pageVisitCount = (req, res, next) => {
    User.findOne({
      _id: req.userData.userId, "visits.postId": req.body.postId
    }, 'visits.$', function (err, user) {
      if (err) {
        res.status(401).json({
          message: "Error Occured!"
        });
      } else {

        if(user == null){
           User.findByIdAndUpdate({
              _id: req.userData.userId
           }, {
                $push: {
                   visits: {
                      "postId": req.body.postId,
                      visitCount: 1
                   }
                }
           },  function (err) {
             if(err) 
                return res.status(401).json({
                   message: "Error Occured when creating new visit!"
                })
             return res.status(200).json({
                message: "Success"
             })
           })
        }

        User.update({
            _id: req.userData.userId, "visits.postId": req.body.postId
        }, {
              $inc: { "visits.$.visitCount":  1 }
        },(err) => {
           if (err) {
              res.status(401).json({
                 message: "Error Occured!"
              })
           } else {
              res.status(200).json({
                 message: "Update successful!"
              })
           }
        });
      }
    });
};