157

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

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

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
4

7 回答 7

280

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

尝试以下类似的方法,或者模式映射:

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
于 2011-11-03T15:21:05.193 回答
69

如果有人只想要一个简单的复制粘贴加载项功能,这是 Will Nathan 的答案的抽象:

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

只需要做find(collection_name, query, callback);就可以得到结果。

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

find('foo', {a : 1}, function (err, docs) {
            console.dir(docs);
        });
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ]
于 2011-07-17T01:12:32.213 回答
38

你可以做这样的事情,而不是你将访问 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
        })
    });

});
于 2016-10-25T01:28:50.113 回答
17

我遇到了同样的问题,并且能够使用现有的 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);
于 2011-07-06T15:20:44.473 回答
7

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

尝试:

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

此外,您可以在 mongo shell 中执行“显示集合”以查看数据库中的集合 - 也许尝试通过 mongoose 添加记录并查看它的结束位置?

从连接字符串的外观来看,您应该在“测试”数据库中看到记录。

希望能帮助到你!

于 2011-04-27T02:55:12.067 回答
5

至少对我来说,其他不明显的事情是,当使用 Mongoose 的第三个参数来避免用同名的新集合替换实际集合时,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(...),并且几乎可以肯定变量不会破解它。

于 2016-04-20T16:44:09.607 回答
1

转到 MongoDB 网站,登录>连接>连接应用程序>复制>粘贴在 'database_url' >集合>复制/粘贴在 'collection' 中。

var mongoose = require("mongoose");
mongoose.connect(' database_url ');
var conn = mongoose.connection;
conn.on('error', console.error.bind(console, 'connection error:'));
conn.once('open', function () {

conn.db.collection(" collection ", function(err, collection){

    collection.find({}).toArray(function(err, data){
        console.log(data); // data printed in console
    })
});

});

很高兴能帮助你。通过 RTTSS。

于 2021-01-08T04:35:46.970 回答