【问题标题】:Mongoose Fails to retrieve documentsMongoose 无法检索文档
【发布时间】:2017-08-15 09:37:15
【问题描述】:

我现在正在学习 MongoDB+Mongoose+Express。而且我正面临一个我自己无法解决的错误。

我的 MongoDB 设置(一个有 2 个集合的数据库,每个集合都有一些文档):

app.js 与数据库的连接:

const dbConnectionString = process.env.MONGODB_URI || 'mongodb://localhost';
mongoose.connect(dbConnectionString + '/blog');

posts.js 模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PostsSchema = new Schema({
    any: {}
});

var Posts = mongoose.model('Posts', PostsSchema);

module.exports = Posts;

blog.js 路由:

var express = require('express');
var router = express.Router();
var Posts = require('../models/posts')

router.get('/', function(req, res, next) {
  console.log('Route works');
  console.log(Posts);
  Posts.find((err,posts) => {
    if( err ) return console.log('DB Error', err);
    console.log('Posts Received', posts);
    res.render('blog', { title: 'My Blog', posts : posts });  
  });
});

module.exports = router;

当我运行 mongodb 和节点服务器时,成功访问它的 console.logs Schema 和

Route works
Posts Received []

因此,虽然与数据库的连接似乎有效(我没有收到错误),但我无法从中获取数据。我知道由于缺乏知识,我遗漏了一些明显的东西,但是我通过猫鼬文档进行的搜索没有帮助。请指教并感谢您的帮助!

【问题讨论】:

  • 尝试传递一个空对象作为第一个参数来查找。 Posts.find({} , (err,posts) => { ..
  • 同样的结果;收到的帖子的路线、架构、[]
  • 您必须定义架构属性。类似var PostsSchema = new Schema({ title: String, content: String });
  • 我将其更改为您指定的属性,但仍然得到空数组。我也不认为我必须定义它们才能使其工作。
  • 您对架构属性是正确的。感谢您纠正我。

标签: javascript node.js mongodb mean-stack


【解决方案1】:

问题是你没有传递任何对象来查找。

mongoose 中的 find 函数需要一个查询参数。如果需要检索整个集合,可以传递一个空对象:

MongooseSchema.find({},callback)

第一个对象是查询。你也可以在那里使用一些选择器。例如,假设您希望每个人都有一个确定的头衔,在这种情况下,您可以执行以下操作:

MongooseSchema.find({title:"title"},callback)

对于多个查询参数,可以用逗号分隔:

MongooseSchema.find({title:"title",subtitle:"subtitle"},callback)

等等。我建议你看一下关于这个问题的猫鼬手册部分:

http://mongoosejs.com/docs/queries.html

[更新]

在这种情况下的问题是猫鼬命名约定与您使用的名称不匹配。 Mongoose 以小写名称进行查询,在这种情况下,由于名称开头的大写 P 没有找到 Posts 集合。它是通过改变'posts'来解决的,都是小写的。

再次提醒一下,mongoose 在创建集合时也会将名称复数,所以在 mongodb 中创建集合时也应该注意这一点。

@veeram 的参考资料: http://mongoosejs.com/docs/guide.html#collection

【讨论】:

  • 您的答案似乎正确。但是,我添加了一个空对象作为 .find 的第一个参数,但收到的 Posts 仍然是一个空数组。我注意到在您的示例中,您使用了 db.colelction.find,这就是我在 mongodb 控制台中编写它的方式。然而,在我的 Mongoose 中,我编写了 Posts.find(),而 Posts 是一个 Mongoose Schema(参见相关代码)。也许这是个问题?
  • 您是否尝试将两者都打印?错误和帖子?有时我会不小心互换它们(我仍然不记得顺序)
  • 是的,两者都打印,并且顺序正确: Posts.find({}, (err,posts) => { if( err ) return console.log('DB Error', err) ; console.log('Posts Received', posts); res.render('blog', { title: 'My Blog', posts : posts }); });
  • I GET: TypeError: Posts.findAll is not a function 代码: Posts.findAll().then((posts, data) => { console.log('Posts', posts); 控制台.log('数据', 数据); });
  • 我的错,这是我的内部功能。而不是 findAll,把 .find({}).exec(.....)
猜你喜欢
  • 2018-09-11
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2013-10-23
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多