例如。用户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
});
我正在考虑让cron工作每5分钟运行一次,根据userResponseTime
的数据计算平均时间,但我不喜欢这个,因为它消耗了资源
任何人都有这方面的经验请帮忙。
谢谢!
答案 0 :(得分:1)
要显示/计算值,您需要获取所选用户的相关userResponseTime对象。 所以这里的计划
计算当前所选用户的平均响应时间
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;
});
或者你可以获得用户的所有数据,所有数据都是他们的回复,之后是循环
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
前/后挂钩的平均时间