如何使用 Mongoose 访问先前存在的集合?

我在数据库 test中收集了300个 question对象。我可以通过 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
174920 次浏览

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

尝试:

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

此外,您可以在 mongoshell 中执行“ show 集合”,以查看数据库中的集合——也许可以尝试通过 monose 添加一条记录,看看它最终会出现在哪里?

从连接字符串的外观来看,您应该看到“ test”db 中的记录。

希望能有帮助!

我遇到了同样的问题,能够使用现有的 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(collection_name, query, callback);就可以得到结果。

例如,如果我在一个集合‘ 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 的第三个参数来避免将实际的集合替换为一个具有相同名称的新集合时,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(...),并且变量几乎肯定不会破解它。

你可以这样做,然后你就可以访问猫鼬内部的本地 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
})
});


});

2022年最新情况

如果您得到一个 MongoInvalidArgumentError: The callback form of this helper has been removed.错误消息,下面是使用 async/await的新语法:

const mongoose = require("mongoose");
mongoose.connect('mongodb://localhost/productsDB');


const connection = mongoose.connection;


connection.on('error', console.error.bind(console, 'connection error:'));
connection.once('open', async function () {


const collection  = connection.db.collection("Products");
collection.find({}).toArray(function(err, data){
console.log(data); // it will print your collection data
});


});

登录 MongoDB 网站,登录 > Connect > Connect Application > 复制 > 粘贴到‘ database _ url’> Collections> 复制/粘贴到‘ 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
})
});
});

我尝试了所有的答案,但没有一个成功,最后得到了答案锄头做到这一点。

var mongoose = require('mongoose');
mongoose.connect('mongodb://0.0.0.0:27017/local');


// let model = require('./test1');


setTimeout(async () => {
  

let coll = mongoose.connection.db.collection(<Your collection name in plural form>);
// let data = await coll.find({}, {limit:2}).toArray();
// let data = await coll.find({name:"Vishal"}, {limit:2}).toArray();
// let data = await coll.find({name:"Vishal"}, {projection:{player:1, _id:0}}).toArray();
let data = await coll.find({}, {limit:3, sort:{name:-1}}).toArray();
console.log(data);
    

}, 2000);

我还提到了一些要过滤掉的标准。删除和更新也可以通过这个来完成。

谢谢。

确保连接到正确的数据库以及数据库中的正确集合。

可以在连接字符串中包含数据库的名称。

在以下连接字符串中注意 databasename:

var mongoose = require('mongoose');
const connectionString = 'mongodb+srv://username:password@hosturl.net/databasename';


mongoose.connect(connectionString);