forked from Deen-Bridge/dnb-backend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackfillReviewStats.js
More file actions
39 lines (31 loc) · 1.18 KB
/
Copy pathbackfillReviewStats.js
File metadata and controls
39 lines (31 loc) · 1.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import dotenv from "dotenv";
import mongoose from "mongoose";
import Course from "../models/Course.js";
import Book from "../models/Book.js";
import { computeReviewStats } from "../utils/reviewStats.js";
dotenv.config();
const statsDiffer = (document, stats) =>
document.rating !== stats.rating ||
document.numReviews !== stats.numReviews ||
[1, 2, 3, 4, 5].some((star) => (document.ratingBreakdown?.[star] ?? 0) !== stats.ratingBreakdown[star]);
const backfillModel = async (Model) => {
let updated = 0;
const cursor = Model.find().cursor();
for await (const document of cursor) {
const stats = computeReviewStats(document.reviews);
if (!statsDiffer(document, stats)) continue;
await Model.updateOne({ _id: document._id }, { $set: stats });
updated += 1;
}
return updated;
};
if (!process.env.MONGO_URI) {
throw new Error("MONGO_URI must be set to backfill review statistics");
}
try {
await mongoose.connect(process.env.MONGO_URI);
const [courses, books] = await Promise.all([backfillModel(Course), backfillModel(Book)]);
console.log(`Backfilled review statistics for ${courses} courses and ${books} books.`);
} finally {
await mongoose.disconnect();
}