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