Mongoose 返回匹配查询的所有文档的计数

Posted

技术标签:

【中文标题】Mongoose 返回匹配查询的所有文档的计数【英文标题】:Mongoose return count of all documents that match query 【发布时间】:2020-02-19 10:07:36 【问题描述】:

全部,

问题,我有一个查询,它根据几个条件过滤帖子,然后返回这些帖子。然后我设置一个限制,跳过(用于分页)并将它们返回给用户。

我现在要做的是实现分页,我需要的是找到与上述查询匹配的总文档数。

基本上,如果我有,可以在 db 中说 100 多个匹配查询的文档,但只返回 25 个。我需要匹配查询的总数。

这是我的查询,我阅读了有关聚合的信息,但不确定 100% 如何实现它,或者找到更好的解决方案来返回与我的查询匹配的文档总数:

let regex = new RegExp(value.searchQuery, "i");
    const query = Post.find();
    if (value.searchQuery && value.city && value.category) 
        query.where(
            $and: [
                
                    $or: [ title: regex ,  description: regex ]
                
            ],
            city: value.city,
            category: value.category
        );
     else if (value.searchQuery && value.city && !value.category) 
        query.where(
            $and: [
                
                    $or: [ title: regex ,  description: regex ]
                
            ],
            city: value.city
        );
     else if (value.searchQuery && value.category && !value.city) 
        query.where(
            $and: [
                
                    $or: [ title: regex ,  description: regex ]
                
            ],
            category: value.category
        );
     else if (value.searchQuery && !value.city && !value.category) 
        query.where(
            $and: [
                
                    $or: [ title: regex ,  description: regex ]
                
            ]
        );
     else if (!value.searchQuery && value.city && value.category) 
        query.where( city: value.city, category: value.category );
     else if (!value.searchQuery && value.city && !value.category) 
        query.where( city: value.city );
     else if (!value.searchQuery && value.category && !value.city) 
        query.where( category: value.category );
    

    if (value.sort.createdAt) 
        query.setOptions( createdAt: value.sort.createdAt );
     else if (value.sort.deadline) 
        query.setOptions( deadline: value.sort.deadline );
    
    query
        .setOptions(
            limit: limitPerPage,
            skip: skipAmount,
            sort: !value.sort.createdAt
                ?  deadline: value.sort.deadline 
                :  createdAt: value.sort.createdAt 
        )
        .exec();

【问题讨论】:

【参考方案1】:

您必须执行第二次操作才能使用 query.countDocuments() 获取计数

Mongoose documentation

【讨论】:

count() 已被弃用,对吗? countDocuments() 是要使用的。但是您将如何执行此操作?我的意思是我应该如何通过所有过滤器,例如包含在 query.where(...) 您可以添加新变量 countQuery 就像这样 const query = Post.find(); const countQuery = query; if (value.searchQuery && value.city && value.category) query.where( . . . ); countQuery.where( . . . ).count(); 这应该会给您计数。

以上是关于Mongoose 返回匹配查询的所有文档的计数的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

Mongoose find - 从查询中返回所有匹配的至少一个

使用 mongoose 从数组中返回匹配的文档

使用 mongoose 从数组中返回匹配的文档

使用匹配的查询从每个集合中删除所有文档

使用匹配的查询从每个集合中删除所有文档