core: fix nLiked (#1128)

This commit is contained in:
undefined committed 2026-02-19 17:38:11 +08:00
1 parent 6d639f76f2
commit f42427ee83
3 files changed
+38 -11

No files matched your search

+1 -1
View File
@@ -287,7 +287,7 @@ DomainUserSetting(Schema.object({
rpInfo: Schema.any().extra('family', 'setting_storage').disabled().hidden(), rpInfo: Schema.any().extra('family', 'setting_storage').disabled().hidden(),
...Object.fromEntries(['nAccept', 'nSubmit', 'nLike', 'rp', 'rpdelta', 'rank', 'level', 'join'].map((i) => ([ ...Object.fromEntries(['nAccept', 'nSubmit', 'nLiked', 'rp', 'rpdelta', 'rank', 'level', 'join'].map((i) => ([
i, Schema.number().default(0).extra('family', 'setting_storage').disabled().hidden(), i, Schema.number().default(0).extra('family', 'setting_storage').disabled().hidden(),
]))), ]))),
+36 -9
View File
@@ -7,6 +7,27 @@ import db from '../service/db';
const sumStatus = (status) => ({ $sum: { $cond: [{ $eq: ['$status', status] }, 1, 0] } }); const sumStatus = (status) => ({ $sum: { $cond: [{ $eq: ['$status', status] }, 1, 0] } });
export async function udoc(report) { export async function udoc(report) {
const userStats = new Map<string, { nLiked?: number, nAccept?: number, nSubmit?: number }>();
report({ message: 'Udoc nLiked' });
const likedPipeline = [
{
$match: {
docType: document.TYPE_PROBLEM_SOLUTION,
vote: { $gt: 0 },
},
},
{
$group: {
_id: { domainId: '$domainId', uid: '$owner' },
nLiked: { $sum: '$vote' },
},
},
];
for await (const adoc of document.coll.aggregate<any>(likedPipeline, { allowDiskUse: true })) {
userStats.set(`${adoc._id.domainId}/${adoc._id.uid}`, { nLiked: adoc.nLiked });
}
report({ message: 'Udoc' }); report({ message: 'Udoc' });
const pipeline = [ const pipeline = [
{ {
@@ -31,20 +52,26 @@ export async function udoc(report) {
}, },
}, },
]; ];
for await (const adoc of db.collection('record').aggregate<any>(pipeline, { allowDiskUse: true })) {
const key = `${adoc._id.domainId}/${adoc._id.uid}`;
const stat = userStats.get(key) || {};
stat.nSubmit = adoc.nSubmit;
stat.nAccept = adoc.nAccept;
userStats.set(key, stat);
}
let bulk = db.collection('domain.user').initializeUnorderedBulkOp(); let bulk = db.collection('domain.user').initializeUnorderedBulkOp();
const cursor = db.collection('record').aggregate<any>(pipeline, { allowDiskUse: true }); for (const [key, stat] of userStats) {
for await (const adoc of cursor) { const [domainId, uid] = key.split('/');
bulk.find({ bulk.find({ domainId, uid: +uid }).updateOne({
domainId: adoc._id.domainId,
uid: adoc._id.uid,
}).updateOne({
$set: { $set: {
nSubmit: adoc.nSubmit, nSubmit: stat.nSubmit || 0,
nAccept: adoc.nAccept, nAccept: stat.nAccept || 0,
nLiked: stat.nLiked || 0,
}, },
}); });
if (bulk.batches.length > 100) { if (bulk.batches.length > 100) {
await bulk.execute(); await bulk.execute(); // eslint-disable-line no-await-in-loop
bulk = db.collection('domain.user').initializeUnorderedBulkOp(); bulk = db.collection('domain.user').initializeUnorderedBulkOp();
} }
} }
@@ -153,7 +153,7 @@
</div> </div>
<div class="balancer__body"> <div class="balancer__body">
<div class="numbox"> <div class="numbox">
<div class="numbox__num medium">{{ udoc.nLike or 0 }}</div> <div class="numbox__num medium">{{ udoc.nLiked or 0 }}</div>
<div class="numbox__text">{{ _('Solutions Liked') }}</div> <div class="numbox__text">{{ _('Solutions Liked') }}</div>
</div> </div>
</div> </div>