Mongoose的find()方法没有返回结果。

23

我设置了一个路由,使用了一个名为 Todo 的模型,代码如下:

app.get('/api/todos', function(req, res) {
    Todo.find({},function(err, todos) {
        if (err)
            res.send(err);
        console.log("number of todos " + todos.length);
        res.json(todos); // return all todos in JSON format
    });
});

然而,todos.length 总是为0,因为它没有找到任何结果。 当我运行时:

use test3
db.Todo.find() 

我确信我已经连接到了同一个数据库。我可以在mongod控制台中看到连接。 我的连接位于config/db.js文件中:

module.exports = {
    url : 'mongodb://localhost/test3'
}

我在 server.js 文件中的连接如下:

var db = require('./config/db');
mongoose.connect(db.url);

在Mongo Shell中,我得到了1个结果。我期望这个结果能够被find查询返回。 我是否漏掉了什么? 我正在使用Mongoose 3.6

谢谢


2
你确定你在程序中连接的是与shell相同的数据库吗?如果不确定,请在问题中添加你的数据库连接代码和与shell连接的示例。 - Neil Lunn
我已经添加了你要求的更多信息。 - user3539643
2
还要注意的是,mongoose默认将模型名称转换为小写并进行其他规则的复数形式。因此,除非您覆盖了这个设置,否则mongoose会寻找一个名为“todos”的集合,该集合可能不存在。 - Neil Lunn
2个回答

89

看起来你已经在现有的数据库中创建了集合,现在尝试使用mongoose模型访问这些集合。

问题在于mongoose使用一些默认值,你可能不知道,所以你从shell中展示的示例与mongoose默认情况下执行的内容不同。

因此,你可以将你的集合重命名为mongoose默认期望的名称,或者更改mongoose执行的内容以匹配你现有的名称。在后一种情况下,你可以直接按以下方式定义模型名称:

mongoose.model( "Todo", toDoSchema, "Todo" );

所以,方法的第三个参数实际上指定了要使用的集合的显式名称。如果没有这个参数,则根据默认规则假定名称为"todos"。

使用任一方法使它们匹配。


我遇到了类似的问题两个小时,我需要在我的集合名称后面添加“s”,天啊...谢谢。 - PayteR
1
无法相信这个答案仍然是正确的。 - Kartik Patel
我甚至没有碰过我的be/mongo/fe,什么都没有做,在30多天后它停止返回结果(返回一个空数组)。经过几个小时的煎熬,我找到了这个线程。我添加了第三个参数,它就可以工作了。我不明白为什么这还没有被修复。无论如何,未来的读者,只需添加第三个参数,不要相信mongoose。 - Rounak Jain
@RounakJain 我现在也遇到了同样的问题(收到空白响应),我尝试添加第三个参数,但问题仍然存在。是的,我也没有修改我的代码;它今天突然停止工作了! - Sohail Saha

0

我曾经遇到过这个问题,我为MongoDB中已存在的集合定义了模型,并使用this显式collection选项来阻止Mongoose生成复数的集合名称。不小心写成了Collection,导致结果停滞不前。因此,在使用显式选项时要小心,它们是区分大小写的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接