如何访问Mongoose预先存在的collections?

我在数据库test中有300个question对象的大集合。 我可以通过MongoDB的交互式shell轻松地与这个集合交互; 但是,当我尝试通过Mongoose在express.js应用程序中获取集合时,我得到一个空数组。

我的问题是,我怎样才能访问这个已经存在的数据集,而不是用快速重新创build它? 这是一些代码:

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); mongoose.model('question', new Schema({ url: String, text: String, id: Number })); var questions = mongoose.model('question'); questions.find({}, function(err, data) { console.log(err, data, data.length); }); 

这输出:

 null [] 0 

Mongoose添加了在模式下指定集合名称的能力,或者在声明模型时作为第三个参数。 否则,它将使用您映射到模型的名称给出的复数forms。

尝试像下面这样的模式映射:

 new Schema({ url: String, text: String, id: Number}, { collection : 'question' }); // collection name 

或模型映射:

 mongoose.model('Question', new Schema({ url: String, text: String, id: Number}), 'question'); // collection name 

Will Nathan的答案如果有人只是想要一个简单的复制粘贴插件function,这是一个抽象:

 function find (collec, query, callback) { mongoose.connection.db.collection(collec, function (err, collection) { collection.find(query).toArray(callback); }); } 

简单地做find(collection_name, query, callback); 给出结果。

例如,如果我在一个集合'foo'中有一个文档{a:1},并且我想列出它的属性,我这样做:

 find('foo', {a : 1}, function (err, docs) { console.dir(docs); }); //output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ] 

我有同样的问题,并能够使用下面的代码使用现有的Mongoose连接运行无模式查询。 我已经添加了一个简单的约束'a = b'来显示你将添加这样一个约束:

 var action = function (err, collection) { // Locate all the entries using find collection.find({'a':'b'}).toArray(function(err, results) { /* whatever you want to do with the results in node such as the following res.render('home', { 'title': 'MyTitle', 'data': results }); */ }); }; mongoose.connection.db.collection('question', action); 

你可以做这样的事情,比你可以访问mongoose内部的本地mongodb函数:

 var mongoose = require("mongoose"); mongoose.connect('mongodb://localhost/local'); var connection = mongoose.connection; connection.on('error', console.error.bind(console, 'connection error:')); connection.once('open', function () { connection.db.collection("YourCollectionName", function(err, collection){ collection.find({}).toArray(function(err, data){ console.log(data); // it will print your collection data }) }); }); 

你确定你已经连接到数据库? (我问,因为我没有看到指定的端口)

尝试:

 mongoose.connection.on("open", function(){ console.log("mongodb is connected!!"); }); 

另外,你可以在mongo shell中做一个“show collections”来查看你的数据库中的集合 – 也许可以尝试通过mongoose添加一个logging,看看它在哪里结束?

从连接string的外观,你应该看到“testing”数据库中的logging。

希望能帮助到你!

对于我来说至less不是那么明显的是,当使用Mongoose的第三个参数来避免用一个具有相同名称的new Schema(...)集合replace实际的集合时, new Schema(...)实际上只是一个占位符,不会干涉现存的模式

 var User = mongoose.model('User', new Schema({ url: String, text: String, id: Number}, { collection : 'users' })); // collection name; User.find({}, function(err, data) { console.log(err, data, data.length);}); 

工作正常,并返回所有字段 – 即使实际(远程)架构不包含这些字段。 mongoose仍然会希望它作为new Schema(...) ,一个variables几乎肯定不会破解它。