MongoDB 重复结果问题

问题描述 投票:0回答:1

我正在开发一个使用 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),这可能会导致一些性能问题。

mongodb mongodb-query aggregation-framework
1个回答
0
投票

您不需要

$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
  };
© www.soinside.com 2019 - 2024. All rights reserved.