用户评分基于MongoDB中的响应时间

时间:2018-01-16 15:59:34

标签: mongodb mongoose rating

例如。用户A发布产品以供销售。用户B单击以查看产品并希望与用户A聊天。响应时间是用户B点击聊天按钮与用户A直到用户A回复的时间。

我需要做的是有很多用户喜欢用户B,我需要显示用户的平均响应时间。例如:用户A在2分钟内响应用户B,在4分钟内响应用户C,因此平均响应时间为3分钟。

这是我的moongoose模式:

var users = new Schema({
    _id: ObjectId,
    name:  String,
    averageResponseTime: Number,
});

var userResponseTime = new Schema({
    _id: ObjectId,
    userId:  ObjectId,
    respondToUserId: ObjectId,
    responseTime: Number
});

我需要能够在用户个人资料页面中获取并显示平均响应时间。

计算和存储averageResponseTime值的推荐方法是什么?

我正在考虑让cron工作每5分钟运行一次,根据userResponseTime的数据计算平均时间,但我不喜欢这个,因为它消耗了资源

任何人都有这方面的经验请帮忙。

谢谢!

1 个答案:

答案 0 :(得分:1)

要显示/计算值,您需要获取所选用户的相关userResponseTime对象。 所以这里的计划

  1. 获取 userResponseTime
  2. 的所有收藏数据
  3. 计算当前所选用户的平均响应时间

      userResponseTimeCollection.find({"userId":{$eq:require('mongoose').Types.ObjectId(userId)}}).toArray(function(err, results) {
        var responseTimes = 0;
        var responseCount = 0;
        var avgResponseTime = 0;
    
        results.forEach(function(item, i, arr){
          responseTimes += item.responseTime;
          responseCount++;
        });
        if(responseCount > 0)
          avgResponseTime = responseTimes / responseCount;
      });
    
  4. 或者你可以获得用户的所有数据,所有数据都是他们的回复,之后是循环

      var users = [];
      var userResponses = [];
    
      usersCollection.find({}).toArray(function(err, results) {
        if(results)
          users = results;
      });
    
      userResponseTimeCollection.find({}).toArray(function(err, results) {
        if(results)
          userResponses = results;
      });
    
      users.forEach(function(user) {
        var responseTimes = 0;
        var responseCount = 0;
        var avgResponseTime = 0;    
        userResponses.forEach(function(response) {
          if(response.userId == user._id){
            responseTimes += response.responseTime;
            responseCount++;
          }
        });
        if(responseCount > 0)
          avgResponseTime = responseTimes / responseCount;
        user.ResponseRate = avgResponseTime;
      });
    

    也许它看起来势不可挡,但希望你有主意。 GL!

    顺便说一句。如果您需要保留有关avg响应的此类数据,那么最好重新计算mongoose http://mongoosejs.com/docs/subdocs.html

    前/后挂钩的平均时间