如何使用Mongoose访问现有集合?


139

question在数据库中收集了300个对象test。我可以通过MongoDB的交互式外壳轻松地与该集合进行交互;但是,当我尝试在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

Answers:


251

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

尝试如下所示,或者映射模式:

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

9
我在文档中哪里可以找到此信息?这确实有帮助,但是没有地方解释复数。
StudioWorks 2014年

嗨,@calvinfo我如何在运行时更改集合名称?我有5个UserSchema集合,我想给每个命名一个不同的名称,例如:users_server1,users_server2,users_server3 ...
Ragnar

1
请提供示例查询,例如–Steve Model.collection.insert();..
K

6
同样在这里,我花很多时间搞清楚这个问题,该文件可以在这里找到mongoosejs.com/docs/guide.html#collection
ElvinD

3
这对我有用。我有一个mongorestored的用户集合。为了获得猫鼬的访问权,我做了mongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
杰克·

61

如果有人只想要简单的复制粘贴加载项功能,这是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 } ]

在API上运行集成测试时,这非常有用
Greg

嗨,这是原子操作吗?假设我尝试将文档保存在回调函数中。这是原子的吗?
Maulik Soneji'3

23

您可以执行以下操作,而不是访问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
        })
    });

});

1
完美的答案!
CandleCoder

15

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

1
这正是我想要的,因为猫鼬没有任何gridFS支持。我使用这种方法从gridfs(gridstore)中获取文件元数据。只需将question上面的代码替换为,fs.files就可以了。
k00k 2012年

7

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

尝试:

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

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

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

希望能帮助到你!


4
有趣的是,questions当我尝试访问的数据在集合中时,它实际上是在集合中存储信息question。猫鼬会自动将集合/型号名称复数吗?
theabraham 2011年

是的,我认为确实如此...哈!我刚刚开始自己​​,所以我还没有探索所有的角落和缝隙……但是我回想起我在Google网上论坛浏览时看到的栗子微风。
2011年

3

至少对我而言,还有一点不明显的是,当使用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);});

工作正常并返回所有字段-即使实际(远程)模式不包含这些字段也是如此。猫鼬仍然会希望它为new Schema(...),并且几乎可以肯定,变量不会破坏它。


1
它给我“集合名称必须是字符串”错误,编辑:作为“ calvinfo”的答案,如果要在模型构造函数中给出集合名称,则只需以字符串形式而不是对象模型传递集合名称。因此,如果这样编辑,您的答案将是正确的,var User = mongoose.model('User',new Schema({url:String,text:String,id:Number},'users')); //集合名称;User.find({},function(err,data){console.log(err,data,data.length);});
KaanErkoç17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.