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

Mongoose查询MongoDB用户文档返回空结果如何解决

问题描述

测试查询MongoDB所有用户文档的API时,接口始终返回空结果:数据库连接日志显示正常,接口返回200状态码,控制台打印的查询结果为空数组,但目标数据库中实际存在1条用户文档,无法定位错误。
涉及的核心代码如下:

  1. 用户模型定义
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

let userSchema = new Schema({
  userId: {
    type: String
  },
  pw: {
    type: String
  },
}, {
  collection: "creds"
});
module.exports = mongoose.model("User", userSchema);
  1. 查询所有用户的API接口
router.get("/session/users", async (req, res) => {
  try {
    User.find({}, function (err, user) {
      if (err) {
        console.log(err);
        res.status(500).send({
          message: "Interal server error:" + err.message,
        });
      } else {
        console.log(user);
        res.json(user);
      }
    });
  } catch (e) {
    console.log(e);
    console.log(req.body.userId);
    res.status(500).send("Interal server error: " + e.message);
  }
});
  1. 接口调用控制台输出
Connection to the database instance was successful
[]
GET /api/session/users 200 90.584 ms - 2
问题根因

查询返回空数组说明Mongoose执行查询操作本身没有报错,没有匹配到数据的核心原因是查询的目标库/集合和你实际存储数据的库/集合不一致,另外代码写法存在不规范的隐患:

  • 大概率是连接的数据库不匹配:比如插入测试数据时选中了同实例下的其他数据库,但Mongoose连接串指向的是另一个库,该库下的creds集合本身是空的。
  • 也可能是集合不匹配:插入数据时没有指定集合,数据被写入了Mongoose默认生成的users集合(模型名User转小写复数),但模型显式配置了绑定creds集合,查询时不会读取users集合的数据。
  • 代码写法问题:接口标记为async函数,但User.find使用回调写法,外层的try/catch完全无法捕获回调内的异常,存在报错漏处理的风险;同时代码里的错误提示单词拼写错误(Interal应为Internal)。
修复步骤
  1. 核对连接配置
    找到Mongoose连接代码,确认连接串中指定的数据库名,和你存储用户数据的数据库名完全一致。标准连接串格式为mongodb://<地址>:<端口>/<数据库名>,必须确保<数据库名>部分和存数据的库名完全相同。
  2. 核对集合数据
    在MongoDB shell或可视化工具中切换到Mongoose连接的目标数据库,执行命令db.creds.find(),如果返回为空,说明数据确实不在该集合中:要么把测试数据迁移到该库的creds集合,要么修改模型的collection配置,指向你实际存储数据的集合。
    可以在接口中加两行调试代码,直接打印Mongoose实际操作的库和集合,快速定位配置问题:
// 打印当前模型绑定的集合名
console.log("当前查询集合:", User.collection.collectionName);
// 打印当前连接的数据库名
console.log("当前连接数据库:", User.collection.conn.name);
  1. 修正接口写法
    不要混用async/await和回调函数,统一使用async/await语法简化代码,同时修正拼写错误,修改后的接口代码如下:
router.get("/session/users", async (req, res) => {
  try {
    const userList = await User.find({});
    console.log(userList);
    return res.json(userList);
  } catch (e) {
    console.log(e);
    return res.status(500).send({
      message: "Internal server error: " + e.message
    });
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:33:24