为何MongoDB的estimatedDocumentCount返回不符合查询条件的统计值?
问题原因与解决方案
核心问题
你遇到的问题出在estimatedDocumentCount()方法的使用上:这个方法不接受查询过滤参数,它只会返回整个MongoDB集合的总文档数量,完全忽略你传入的query条件。
所以在getSeries中,即便你传入{ type: "series" },estimatedDocumentCount(query)依然返回了集合中全部10条type="movie"的文档总数;而find(query)是支持过滤的,因为没有type="series"的数据,所以返回空数组,最终导致分页统计和实际返回数据完全不匹配。
解决方案
将estimatedDocumentCount(query)替换为countDocuments(query),这个方法会严格根据传入的查询条件统计匹配的文档数量,是实现你需求的正确方法。
修改后的代码示例
const ITEMS_PER_PAGE = 4 const filmController = { getMovies: async (req, res) => { const page = req.query.page || 1 const query = { type: "movie" } try { const skip = (page - 1) * ITEMS_PER_PAGE // 替换为countDocuments实现条件统计 const count = await Films.countDocuments(query) const films = await Films.find(query).limit(ITEMS_PER_PAGE).skip(skip) const pageCount = Math.ceil(count / ITEMS_PER_PAGE) res.json({ films: films, pagination: { count, pageCount, }, }) } catch (err) { return res.status(500).json({ msg: err.message }) } }, getSeries: async (req, res) => { const page = req.query.page || 1 const query = { type: "series" } try { const skip = (page - 1) * ITEMS_PER_PAGE // 替换为countDocuments实现条件统计 const count = await Films.countDocuments(query) const films = await Films.find(query).limit(ITEMS_PER_PAGE).skip(skip) const pageCount = Math.ceil(count / ITEMS_PER_PAGE) res.json({ films: films, pagination: { count, pageCount, }, }) } catch (err) { return res.status(500).json({ msg: err.message }) } }, }
补充说明
之前getMovies看似正常只是巧合:因为你的集合中所有文档都是type="movie",所以estimatedDocumentCount()返回的总数刚好和countDocuments(query)的结果一致。但如果后续集合中加入其他类型的文档,getMovies也会出现同样的分页统计错误。
内容的提问来源于stack exchange,提问作者Bunny
相关产品推荐
相关产品推荐

