以下是我在投票上投票的控制人员。
如果用户尚未对帖子投票(voterId
阵列中不存在votes
。然后,将vote
推送到帖子的voterId
数组中,即可添加votes
。然后voteCount
重置为该数组的length
。
关于向postAuthor
发送通知还有一些额外的逻辑,但我省略了该代码,以免混淆问题。
每个post
都有expiresAt
个时间戳。每次投票都会给post
一些更长的生存时间(TTL),但是它将给予多少时间将取决于该帖子属于哪个category
。从本质上讲,更受欢迎的类别,如音乐,将比不太受欢迎的类别(可能是园艺)提供更少的TTL。
所以我需要做的是count
有多少users
感兴趣category
。基于此,我可以计算要添加多少TTL。
问题是任何帖子最多可能有三个类别。无论有多少,我想计算最受欢迎的类别。
我该怎么做?我在考虑为for loop
所属的每个类别执行post
。然后计算,与最后一次计数比较,并在必要时进行分配。
当然,问题在于每个Count
都会返回一个承诺。所以我假设for loop
不起作用。
这是否有合理的解决方案?谢谢
votePost(req, res, next) {
const postId = req.params.id;
const voterId = req.body.voterId;
Post.findById(postId)
.then(post => {
// let followerCount;
// let mostPopularCategoryFollowerCount = 0;
//
// // for (let i = 0; i < post.categories.length; i++) {
// // followerCount = User.count({ interests: { $eq: post.categories[i] } })
// // .then(count => count);
// //
// // if (followerCount > mostPopularCategoryFollowerCount) {
// // mostPopularCategoryFollowerCount = followerCount;
// // }
// // }
if (post.votes.indexOf(voterId) === -1) {
post.votes.push(voterId);
post.voteCount = post.votes.length;
// DO STUFF HERE WITH FOLLOWER COUNT //
post.save()
.then(() => res.send(post));
}
})
.catch(next);
},
答案 0 :(得分:1)
这不是一个完整的实现,只是在我的评论中显示我的意思:
votePost(req, res, next) {
const postId = req.params.id;
const voterId = req.body.voterId;
Post.findById(postId)
.then(function( post ) {
Promise.all(
post.categories.map(function( category ) {
return User.count({ interests: { $eq: category } });
})
)
.then(function( counts ) {
return counts.reduce(function( highest, next ) {
return highest > next ? highest : next;
}, 0);
})
.then(function( mostPopularCategoryFollowerCount ) {
// do stuff with the count
})
.catch(function( err ) {
// error handling
});
})
.catch(next);
}