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

如何在Mongoose中正确获取MongoDB集合的所有文档?

问题原因与解决方案

为什么会拿到Query对象?

Mongoose的BlogPost.find()方法有两种使用逻辑:

  • 当你传入回调函数时,Mongoose会自动触发查询,并把最终结果通过回调的第二个参数返回,这就是你第一段代码能拿到正确文章列表的原因。
  • 当你直接把find()的返回值赋值给变量时,得到的是Mongoose的Query对象——这是一个查询构造器,用来帮你链式添加查询规则(比如.sort()、.limit()),它本身不是查询结果,必须手动触发执行才能拿到数据。

你的第二段代码里,var AllPosts = BlogPost.find(...)赋值的就是这个未执行的Query对象,所以console.log输出的是查询相关的内部结构,而非你需要的文章数据。

正确的写法

写法1:继续用回调函数(适合简单场景)

如果要把数据传给EJS模板,直接在回调里处理结果:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog', {useNewUrlParser: true});

const Schema = mongoose.Schema;
const BlogSchema = new Schema({
    title : String,
    image: String,
    body: String
});

const BlogPost = mongoose.model('posts', BlogSchema);

// 以Express路由为例,把数据传给EJS模板渲染
app.get('/', (req, res) => {
  BlogPost.find((err, posts) => {
    if (err) {
      console.error(err);
      return res.send('查询出错');
    }
    res.render('blog', { allPosts: posts });
  });
});

写法2:用Async/Await(更清晰的现代写法)

Mongoose的Query对象支持Promise规范,所以可以用await等待查询完成,代码结构更直观:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog', {useNewUrlParser: true});

const Schema = mongoose.Schema;
const BlogSchema = new Schema({
    title : String,
    image: String,
    body: String
});

const BlogPost = mongoose.model('posts', BlogSchema);

// 注意:await必须在async标记的函数内使用
app.get('/', async (req, res) => {
  try {
    const allPosts = await BlogPost.find(); // 等待查询完成,直接拿到结果
    res.render('blog', { allPosts: allPosts });
  } catch (err) {
    console.error(err);
    res.status(500).send('服务器错误');
  }
});

写法3:用Promise链式调用

如果不想用async/await,也可以直接用Promise的.then()语法:

BlogPost.find()
  .then(posts => {
    console.log(posts);
    res.render('blog', { allPosts: posts });
  })
  .catch(err => console.error(err));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:06:29