如何访问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几乎肯定不会破解它。