当使用不同的数据库时,mongoose find返回null

时间:2014-09-14 05:24:27

标签: php node.js mongodb database

我有两个名为users和search的数据库。它们都有一个与db name相同的表。 dbs的内容如下。

数据库 - 用户 - 表用户

  • 名称
  • 用户

数据库 - 搜索 - 表格搜索

  • title
  • keywords
  • desc
  • 链接

我使用mongoose列出users表的所有内容,如下所示

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/users');
mongoose.model('users', {name: String});
mongoose.model('users').find({}, function(err, doc){
    if (err) throw err;
    console.log(doc);
});

并且运行良好并返回数据库中的所有用户,但是当我使用以下代码列出搜索表中的所有记录时

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/search');
mongoose.model('search', {title: String});
mongoose.model('search').find({}, function(err, doc){
    if (err) throw err;
    console.log(doc);
});

返回NULL。这可能是什么原因。

1 个答案:

答案 0 :(得分:0)

真的不确定为什么你在这里使用不同的数据库,也许你把这个概念与"集合"混淆了。你可以拥有多少"很多"集合到单个数据库名称空间。这通常是您的应用程序要遵循的最佳模式,其中至少"大多数"如果不是全部,则项目是同一数据库中的集合。

但是你确实拥有不同的数据库并且实际上有一个"搜索"收集在"搜索"数据库,然后你似乎错过了一些关于猫鼬模型的东西。

一般的概念是考虑一个"模型"成为一个单数的"对象的表示。当绑定到"集合"与单数的隐含关系是"复数"。所以这个命名确实是指一个名为" users":

的集合
var User = mongoose.model("User", { "title": String });

因此,在收集"集合",mongoose"复数"模型名称作为实际集合名称。这里的做法是"用户"包含许多"用户"的对象这是一种自然的联想。

事实上,你已经调用了你的模型"用户",所以这实际上并没有按默认规则复数,只是使用已经复数的形式。但是"搜索"的情况并非如此,实际上mongoose默认认为你实际上是指"复数"对于许多人来说,搜索"对象,以及它的自然结果是"搜索"。

因此,如果您已经创建了一个名为&#34的集合,那么搜索"并且在其中有数据,你需要特别告诉mongoose要使用的集合的名称,而不是它默认假设您使用"搜索"。为此,"模型"采取第三个论点:

mongoose.model("search", { "title": String }, "search")

这告诉它实际使用你现有的集合"搜索"而不是"搜索"。

因此,您要么这样做,要么重新命名您的馆藏以符合预期的最佳实践形式。并且考虑将这些保存在单个数据库中,除非您有其他重要原因。