如何在现有Mongoose集合中执行查询?MEAN Angular 2新手求助
嘿,看起来你已经把MEAN项目的基础架子搭得很扎实了!接下来咱们聊聊怎么用Mongoose对现有集合执行查询操作,其实上手很简单,我给你分步骤拆解,再配上常用场景的代码例子:
第一步:在路由文件中引入你的Mongoose模型
你已经在model文件夹里定义并导出了Schema对应的模型,所以首先要在路由文件(比如routes/yourModelRoutes.js)里引入它:
const YourModel = require('../models/yourModel'); // 替换成你的模型实际路径和名称
第二步:编写查询API接口
接下来就可以在路由中添加不同的查询接口了,我给你几个最常用的场景示例:
1. 查询集合中所有文档
使用find()方法,不带参数就会返回集合里的所有文档:
router.get('/all', async (req, res) => { try { const allItems = await YourModel.find(); res.status(200).json(allItems); } catch (err) { res.status(500).json({ message: err.message }); } });
这里用了async/await语法,比传统的回调函数更易读,你也可以用Promise链式调用,不过async/await现在是更主流的写法。
2. 按条件查询单个文档
用findOne()方法,比如根据文档的_id或者其他字段匹配:
router.get('/single/:id', async (req, res) => { try { // 按_id查询 const item = await YourModel.findOne({ _id: req.params.id }); // 也可以按其他字段,比如:findOne({ username: req.query.username }) if (!item) { return res.status(404).json({ message: '目标文档未找到' }); } res.status(200).json(item); } catch (err) { res.status(500).json({ message: err.message }); } });
另外,Mongoose还提供了更简洁的findById()方法,专门用来按_id查询,效果和上面的findOne({ _id: ... })完全一致:
const item = await YourModel.findById(req.params.id);
3. 按条件查询多个文档
给find()方法传入查询条件,就能筛选出符合要求的所有文档,比如查询状态为active的所有数据:
router.get('/active', async (req, res) => { try { const activeItems = await YourModel.find({ status: 'active' }); res.status(200).json(activeItems); } catch (err) { res.status(500).json({ message: err.message }); } });
4. 分页、排序与限制返回数量
如果集合里的数据量很大,分页查询就很有必要了,搭配limit()、skip()和sort()就能实现:
router.get('/paginated', async (req, res) => { // 从请求参数中获取页码和每页数量,默认值分别为1和10 const page = parseInt(req.query.page) || 1; const limit = parseInt(req.query.limit) || 10; const skip = (page - 1) * limit; try { const paginatedItems = await YourModel.find() .sort({ createdAt: -1 }) // 按创建时间倒序排列,1表示升序 .limit(limit) // 限制每页返回的数量 .skip(skip); // 跳过前面page-1页的内容 res.status(200).json(paginatedItems); } catch (err) { res.status(500).json({ message: err.message }); } });
第三步:测试查询接口
你可以用Postman、curl或者直接在浏览器地址栏访问这些接口(因为是GET请求),比如访问http://localhost:3000/api/yourModel/all就能拿到集合里的所有数据了。
额外补充
Mongoose的查询能力远不止这些,比如你还可以用countDocuments()统计符合条件的文档数量,用aggregate()做复杂的聚合查询(分组、求和、关联查询等),等你把基础查询用熟了,再慢慢探索这些进阶功能就好。
内容的提问来源于stack exchange,提问作者Akki619

