Mongodb 如何使用猫鼬访问先前存在的集合?

Mongodb 如何使用猫鼬访问先前存在的集合?,mongodb,node.js,express,mongoose,Mongodb,Node.js,Express,Mongoose,我在一个数据库test中收集了300个question对象。我可以通过MongoDB的交互式shell轻松地与这个集合交互;然而,当我试图在express.js应用程序中通过Mongoose获取集合时,我得到了一个空数组 我的问题是,如何访问这个已经存在的数据集,而不是在express中重新创建它?下面是一些代码: var mongoose = require('mongoose'); var Schema = mongoose.Schema; mongoose.connect('mongod

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

我的问题是,如何访问这个已经存在的数据集,而不是在express中重新创建它?下面是一些代码:

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

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

尝试:

此外,您可以在MongoShell中进行“显示集合”以查看数据库中的集合-也许可以尝试通过mongoose添加一条记录,并查看它的最终位置

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


希望有帮助

我也遇到了同样的问题,能够使用现有的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);

如果有人想要一个简单的复制粘贴加载项功能,下面是Will Nathan答案的摘要:

function find (name, query, cb) {
    mongoose.connection.db.collection(name, function (err, collection) {
       collection.find(query).toArray(cb);
   });
}
只需执行
find(集合名称、查询、回调)将给出结果

例如,如果我在集合“foo”中有一个文档{a:1},并且我想列出它的属性,我会执行以下操作:

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

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

至少对我来说,另一件不明显的事情是,当使用Mongoose的第三个参数来避免将实际集合替换为具有相同名称的新集合时,
新模式(…)
实际上只是一个占位符,并且不会干扰现有模式

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仍然希望它成为
新模式(…)
,而变量几乎肯定不会破解它。

您可以这样做,然后访问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
        })
    });

});

转到MongoDB网站,登录连接连接应用程序复制粘贴到“数据库url”中

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
    })
});
}))


很乐意帮忙。有趣的是,当我试图访问的数据位于
question
集合中时,它实际上将信息存储在
questions
集合中。Mongoose会自动将系列/型号名称复数吗?是的,我想是的。。。哈我自己才刚刚开始,所以我还没有探索所有的角落和缝隙。。。但我记得当我在谷歌群组里转来转去时,看到li'l chestnut轻轻走过。这正是我想要的,因为mongoose没有任何gridFS支持。我使用此方法从gridfs(gridstore)获取文件元数据。只需将上述代码中的
question
替换为
fs.files
,就可以了。我可以在文档中的哪里找到这些信息?这确实有帮助,但没有地方解释复数。嗨,@calvinfo我如何在运行时更改集合名称?我有5个UserSchema集合,我想给每个集合一个不同的名称,例如:users\u server1、users\u server2、users\u server3…请提供示例查询,例如使用
Model.collection.insert()这里也一样,我花了很多时间来解决这个问题,文档在这里找到,这对我来说很有用。我有一个用户集合,我在那里搜索。为了使用mongoose访问它,我做了
mongoose.connect(“mongodb://localhost/fromlab");  var Schema=mongoose.Schema;var User=mongoose.model(“用户”,新模式({}),“用户”);User.find({},function(err,doc){console.log((doc))}
这在APHI上运行集成测试时非常有用,这是原子操作吗?假设我尝试将文档保存在回调函数中。这是原子的吗?它给了我“集合名称必须是字符串”的错误,编辑:作为“calvinfo”的回答,如果你想在模型构造函数中给集合名称,你只需以字符串形式传递集合名称,而不是对象模型。因此,如果这样编辑,您的答案将是正确的,var User=mongoose.model('User',newschema({url:String,text:String,id:Number},'users');//收藏名称;User.find({},函数(err,data){console.log(err,data,data.length);});完美答案!
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
    })
});