You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mongoose无法读取MongoDB文档,请求问题排查

问题排查:MongoDB查询返回0个文档

我配置了Schema、控制器和路由,但访问http://localhost:8080/api/v1/album时,控制台始终显示找到0个文档。Schema看起来和已上传的MongoDB文档一致,以下是相关代码,求帮忙分析问题。

相关代码

Index.js

import express from 'express';
import connectDB from './mongodb/connect.js';
import cors from 'cors';

import * as dotenv from 'dotenv';

import userRouter from './mongodb/routes/user.routes.js'
import albumRouter from './mongodb/routes/album.routes.js'

// ** configs
dotenv.config();

const app = express();
app.use(express.json());
app.use(express.urlencoded());

app.get('/', (req, res) => {
    res.send({ message: "Hello" })
})

app.use('/api/v1/users', userRouter);
app.use('/api/v1/album', albumRouter);

const serverInit = async () => {
    try {
        connectDB(process.env.MONGODB_URL);
        app.listen(8080, console.log('server on 8080'))
    } catch (error) {
        console.log(error)
    }
}

serverInit();

album.js(Schema)

import mongoose, { Schema } from "mongoose";

const AlbumSchema = new mongoose.Schema({
    album_id: {type: String, required: true},
    title: {type: String, required: true},
    artist: {type: String, required: true},
    label: {type: String, required: true},
    genre: {type: String, required: true},
    khz: {type: Number, required: true},
    bitrate: {type: Number, required: true},
    numTracks: {type: Number, required: true},
    runtime: {type: Number, required: true},
    parental: {type: Boolean, required: true},
}, { collection: 'app-data.albums' })

const albumModel = mongoose.model('Album', AlbumSchema)

export default albumModel;

album.routes.js

import express from 'express';

import {
    getAllAlbums,
    getAlbumDetail
} from '../controllers/album.controller.js'

const router = express.Router();

router.route('/').get(getAllAlbums)
router.route('/:id').get(getAlbumDetail)

export default router;

控制器代码

import User from '../models/user.js'
import Album from '../models/album.js'

import * as dotenv from 'dotenv'

dotenv.config();


const getAllAlbums = async (req, res) => {
    try {
        console.log('Retrieving all albums from the app-data.albums collection...');
        const albums = await Album.find({}).limit(req.query._end)  //find all albums in db

        console.log(`Found ${albums.length} albums`);

        res.status(200).json(albums)
    } catch (error) {
        res.status(500).json({ msg: error.message })
    }
}; 

const getAlbumDetail = async (req, res) => {}; 

export {
    getAllAlbums,
    getAlbumDetail
}

可能的问题与修复方案

1. 数据库连接未等待完成

connectDB是异步函数,但当前代码未添加await,导致服务器启动时数据库还未完成连接,查询时自然找不到数据。

修复:

const serverInit = async () => {
    try {
        await connectDB(process.env.MONGODB_URL); // 添加await等待连接完成
        app.listen(8080, () => console.log('server on 8080'))
    } catch (error) {
        console.log(error)
    }
}

2. 集合名称配置错误

Schema中指定的collection: 'app-data.albums'会被Mongoose识别为单个集合名,而不是app-data数据库下的albums集合。正确的做法是在连接URL中指定数据库,集合名只写albums。

修复:

  • 确保你的MONGODB_URL格式为:mongodb://localhost:27017/app-data(末尾指定数据库app-data)
  • 修改Schema的集合配置:
const AlbumSchema = new mongoose.Schema({
    // 字段定义不变
}, { collection: 'albums' }) // 去掉app-data.前缀

3. Schema字段与MongoDB文档类型不匹配

检查MongoDB中的实际文档,确保字段类型和Schema完全一致:

  • khz、bitrate等数值字段是否为Number类型,而非字符串
  • parental是否为布尔值(true/false),而非字符串"true"/"false"

4. 查询参数处理问题

如果req.query._end不存在,会传递undefined给limit,虽然Mongoose会忽略,但可以添加默认值避免意外:

const albums = await Album.find({}).limit(parseInt(req.query._end) || 100) // 添加默认值

内容的提问来源于stack exchange,提问作者CakeoftheCup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:48