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

MongoDB集合已存文档,为何db.products.find()查询无结果?

问题排查与解决方案

可能的原因及对应解决步骤

1. 数据库选择错误

你在Mongo Shell中查询时,可能没切换到正确的test数据库。执行以下命令确认:

use test  # 切换到test数据库
db.products.find()  # 再次查询数据

2. Mongoose集合名称自动转换问题

Mongoose默认会将模型名(Product)转换为小写复数形式的集合名(即products),但如果你的Product模型中手动指定了集合名称,就需要对应查询指定的集合:
比如模型定义如果是这样:

// models/product.js
const mongoose = require('mongoose');
const productSchema = new mongoose.Schema({
  name: String,
  price: Number,
  category: String
}, { collection: 'Product' }); // 手动指定集合名

module.exports = mongoose.model('Product', productSchema);

那你需要在Shell中查询db.Product.find()才能找到数据。

3. 代码执行顺序与错误处理问题

你的代码存在两个潜在问题:

  • 数据保存操作在数据库连接完成前就发起了(虽然Mongoose会排队处理,但最好显式放在连接成功后执行)
  • save的catch块中错误引用了未定义的err变量,应该改为e

修正后的代码:

const mongoose = require('mongoose');
const Product = require('./models/product');

main().catch((err) => {
  console.log("Error")
  console.log(err)
});

async function main() {
  await mongoose.connect('mongodb://localhost:27017/test');
  
  // 确保连接成功后再执行数据操作
  const p = new Product({
    name: 'Banana',
    price: 1.99,
    category: 'fruit'
  });

  try {
    const savedProduct = await p.save();
    console.log(savedProduct);
    // 直接在代码中查询验证
    const products = await Product.find();
    console.log("当前集合数据:", products);
  } catch (e) {
    console.log(e); // 修正错误变量名
  }
};

4. 程序提前退出问题

极少数情况下,Node.js进程可能在Mongoose完成写入操作前就退出了。你可以在保存完成后手动关闭连接,确保操作完成:
在save的then块末尾添加:

mongoose.connection.close();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:20:29