我正在开发一个使用 mongodb 查询来获取结果并处理分页和结果限制的项目。问题是我开始看到每个页面都有重复的结果..我不确定问题是什么。
这是我的询问:
async function getAllResults(uid, jobId, page = 1, limit = 10, sortField = 'id', sortOrder = 'asc') {
const db = await connectToDatabase();
const resultsCollection = db.collection('results');
const totalCount = await resultsCollection.aggregate([
{ $match: { userId: uid, jobId: jobId } },
{ $unwind: "$results" },
{ $count: "total" }
]).toArray();
const total = totalCount[0]?.total || 0;
const sortObj = {};
sortObj[`results.${sortField}`] = sortOrder === 'asc' ? 1 : -1;
const pipeline = [
{ $match: { userId: uid, jobId: jobId } },
{ $unwind: "$results" },
{ $sort: sortObj },
];
if (limit > 0) {
const skip = (page - 1) * limit;
pipeline.push({ $skip: skip });
pipeline.push({ $limit: limit });
}
pipeline.push({
$group: {
_id: null,
results: { $push: "$results" }
}
});
const jobResults = await resultsCollection.aggregate(pipeline).toArray();
if (jobResults.length === 0) {
return { results: [], total: 0, pages: 0 };
}
return {
results: jobResults[0].results,
total: total,
pages: limit > 0 ? Math.ceil(total / limit) : 1
};
}
我使用 Ai 尝试了很多解决方案,但没有一个有效。我知道问题可能出在展开上。有一个解决方案有效,但它需要在内存中处理结果,如果结果很大(10k 到 500k),这可能会导致一些性能问题。
您不需要
$unwind
和$count
,只需使用
{ $set: {total: {$size: "$results"}} }
您可以使用
$slice
代替
$unwind
、
$skip
、
$limit
和 $group
您可以在一个查询中完成此操作,如下所示(未测试):
const jobResults= await resultsCollection.aggregate([
{ $match: { userId: uid, jobId: jobId } },
{ $set: {
total: {$size: "$results"},
results: { $slice: [ "$results", skip, limit ] }
}
}
]).toArray();
return {
results: jobResults[0].results,
total: jobResults[0].total,
pages: limit > 0 ? Math.ceil(total / limit) : 1
};