Unten ist mein Controller für die Abstimmung über einen Beitrag.Wie kann ich mehrere Zählungen durchführen und die höchsten verwenden, wenn sie alle versprechen?
Wenn der Benutzer nicht bereits für die Post abgestimmt hat (ihre voterId
ist nicht im votes
Array vorhanden). Dann wird ihr vote
hinzugefügt, indem man ihre voterId
in das votes
Array der Post drückt. Der voteCount
wird dann auf den length
dieses Arrays zurückgesetzt.
Es gibt einige zusätzliche Logik beim Senden von Benachrichtigungen an die postAuthor
, aber ich habe diesen Code weggelassen, um das Problem nicht zu verschleiern.
Jeder post
hat einen expiresAt
Zeitstempel. Jede Stimme gibt der post
etwas mehr Zeit zu leben (TTL), aber wie viel Zeit es geben wird, hängt davon ab, welcher category
, dem der Beitrag gehört. Im Wesentlichen geben die populäreren Kategorien wie Musik weniger TTL als eine weniger beliebte Kategorie, vielleicht Gartenarbeit.
Also was ich tun muss, ist count
, wie viele users
haben die category
als Interesse. Basierend darauf kann ich berechnen, wie viel TTL hinzugefügt werden soll.
Das Problem ist, dass jeder Beitrag bis zu drei Kategorien haben kann. Wie viele auch immer, ich möchte die Liste der beliebtesten der Kategorien nehmen.
Wie kann ich das tun? Ich dachte daran, eine for loop
für jede Kategorie durchzuführen, die der post
gehört. Dann die Zählung nehmen, mit der letzten Zählung vergleichen und wo nötig zuweisen.
Natürlich ist das Problem damit, dass jeder Count
, ein Versprechen zurückgibt. Also ich nehme an, for loop
wird nicht funktionieren.
Gibt es eine logische Lösung? Danke
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);
},
Haben Sie Ihre for-Schleife schieben alle User.count() in ein Array aufruft. Füttere dieses Array in eine 'Promise.all()', Sobald die Promise.all() aufgelöst wird, hast du alle Kategorien und kannst den Follower-Count-Vergleich in den Callback einfügen. – Shilly