Nodejs mongoose 在一次请求中需要返回某个SCHEMA的总数,又要查询他其中的一些数据.怎么写?

Nodejs mongoose 在一次请求中需要返回某个SCHEMA的总数,又要查询他其中的一些数据.怎么写?

mongoose 在一次请求中需要返回某个SCHEMA的总数,又要查询他其中的一些数据.怎么写? A:{…} 统计A的总数和按查询条件查询出部分数据返回.

4 回复

要在一个请求中同时获取某个Mongoose Schema的总数以及满足特定查询条件的部分数据,你可以使用Promise.all来并行执行两个异步操作。这样可以确保你可以在单次请求中完成这两个任务。下面是一个具体的实现示例:

示例代码

假设我们有一个名为 User 的 Mongoose 模型,并且我们希望获取所有用户的总数以及符合某些条件(例如年龄大于18岁)的用户列表。

const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({ name: String, age: Number }));

async function getUsersInfo() {
    try {
        // 查询符合条件的用户
        const users = await User.find({ age: { $gt: 18 } }).select('name age');

        // 获取用户总数
        const totalUsers = await User.countDocuments();

        return {
            users,
            totalUsers
        };
    } catch (error) {
        console.error("Error fetching user info:", error);
        throw error;
    }
}

// 使用此函数
getUsersInfo()
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.error(error);
    });

解释

  1. 定义模型:首先定义一个 Mongoose 模型 User,它包含两个字段 nameage
  2. 查询数据:使用 find 方法查询年龄大于18岁的用户,并选择性地返回 nameage 字段。
  3. 统计总数:使用 countDocuments 方法统计数据库中所有用户的总数。
  4. 并发执行:这两个操作通过 await 并发执行,确保它们都在同一个请求中完成。
  5. 错误处理:通过 try-catch 块来捕获可能发生的错误,并妥善处理它们。

这种方法利用了 Node.js 的异步特性,使得在单个请求中执行多个数据库操作变得更加高效和简洁。


exports.queryArticle = function(search,pageSize,pageIndex,callback){

    var start_index = pageSize*pageIndex;
    var query = articleModel.find(search).limit(pageSize);  
    if(start_index>0)
    {
        query.skip(start_index);
    }
    query.sort('-create_date');
    query.exec(function (err, list) {
        if(err){
            callback(err);
        }
        else{
            var pagedList = {};
            pagedList.pageIndex = pageIndex;
            pagedList.dataList= list;

            if( pageIndex ==0 ){  //如果是第一页 则需要获取总页面
                articleModel.count(search,function(errcount,count){
                    if(errcount){
                        callback(errcount);
                    }
                    else{
                        pagedList.total = count; 
                        callback(null,pagedList);
                    }
                });
              
            }
            else{
                callback(null,pagedList);
            }            
        }
    });
    
}

如果还要查询B,C文档,按异步回调的规则,岂不是要层层镶套?

要在一次请求中使用 Mongoose 同时获取某个 SCHEMA 的总数和查询其中的部分数据,你可以使用 Promise.all 来并行执行两个查询。这样可以确保两个操作同时进行,提高效率。

以下是一个示例代码:

const mongoose = require('mongoose');
const YourSchemaModel = mongoose.model('YourSchemaName', YourSchema);

app.get('/your-endpoint', async (req, res) => {
    const { queryCondition } = req.query; // 假设查询条件从请求参数中获取

    try {
        const [totalCount, someData] = await Promise.all([
            YourSchemaModel.countDocuments(queryCondition).exec(),
            YourSchemaModel.find(queryCondition, '-__v') // 排除 __v 字段,只选择部分字段
                .limit(10) // 只获取前10条数据
                .sort({ _id: -1 }) // 按照 _id 降序排序
                .exec()
        ]);

        return res.json({
            totalCount,
            someData
        });
    } catch (error) {
        console.error(error);
        return res.status(500).json({ message: 'Internal Server Error' });
    }
});

解释:

  • countDocuments(queryCondition) 用于计算符合查询条件的文档总数。
  • find(queryCondition, '-__v') 用于查询符合条件的数据,并通过第二个参数 -__v 排除 _v 字段。如果需要选择更多或更少的字段,可以在这里指定。
  • .limit(10) 限制结果数量。
  • .sort({ _id: -1 })_id 字段降序排列结果。
  • 使用 Promise.all 并行执行这两个操作,以优化性能。
  • 最终将总数和部分数据作为 JSON 返回给客户端。

这种方式不仅提升了代码的可读性,也提高了查询的效率。

回到顶部