MongoDB动态条件查询API开发:基于用户输入的书籍查询实现
实现POST接口/getParticularBooks查询MongoDB书籍集合
核心逻辑
直接将请求体中的参数作为MongoDB的查询条件传入find()方法即可,MongoDB原生支持多条件的AND查询,刚好匹配传入多个参数的场景。
具体实现示例(以Express框架为例)
以下分别给出原生MongoDB驱动和Mongoose两种常用方案的代码:
1. 原生MongoDB驱动实现
const { MongoClient } = require('mongodb'); const express = require('express'); const app = express(); // 解析JSON格式的请求体 app.use(express.json()); // MongoDB连接配置 const uri = 'mongodb://localhost:27017'; const client = new MongoClient(uri); let booksCollection; // 初始化数据库连接 async function initDB() { await client.connect(); const db = client.db('your-db-name'); // 替换为你的数据库名称 booksCollection = db.collection('books'); // 替换为你的书籍集合名称 console.log('MongoDB连接成功'); } initDB(); // 实现查询接口 app.post('/getParticularBooks', async (req, res) => { try { // 直接把请求体作为查询条件 const queryConditions = req.body; // 查询符合条件的书籍并转为数组 const matchedBooks = await booksCollection.find(queryConditions).toArray(); res.status(200).json({ success: true, data: matchedBooks }); } catch (err) { res.status(500).json({ success: false, message: '查询失败', error: err.message }); } }); // 启动服务 app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
2. Mongoose实现
如果用Mongoose,代码会更简洁:
const express = require('express'); const mongoose = require('mongoose'); const app = express(); app.use(express.json()); // 连接MongoDB mongoose.connect('mongodb://localhost:27017/your-db-name') .then(() => console.log('MongoDB连接成功')) .catch(err => console.error('数据库连接失败', err)); // 定义书籍Schema与Model const bookSchema = new mongoose.Schema({ name: String, year: Number, author: String, // 按需添加其他字段 }); const Book = mongoose.model('Book', bookSchema); // 实现查询接口 app.post('/getParticularBooks', async (req, res) => { try { const matchedBooks = await Book.find(req.body); res.status(200).json({ success: true, data: matchedBooks }); } catch (err) { res.status(500).json({ success: false, message: '查询失败', error: err.message }); } }); app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
关键说明
- 多条件自动适配:当传入
{name: "hi", year: 2020}这类多参数时,MongoDB会自动按AND逻辑筛选同时满足所有条件的书籍,无需额外处理。 - 请求体解析:必须通过
express.json()中间件解析JSON请求体,否则req.body会是undefined。 - 扩展模糊查询:如果需要模糊匹配(比如书名包含关键词),可以将请求体参数转为正则表达式,例如
{name: {$regex: req.body.name, $options: "i"}},严格匹配则直接用原参数即可。
内容的提问来源于stack exchange,提问作者Fear Reaper
相关产品推荐
相关产品推荐

