Как получить доступ к существующей коллекции с помощью Mongoose?
У меня есть большая коллекция из 300 question
объектов в базе данных test
. Я могу легко взаимодействовать с этой коллекцией через интерактивную оболочку MongoDB; однако, когда я пытаюсь получить коллекцию через Mongoose в приложении express.js, я получаю пустой массив.
Мой вопрос в том, как я могу получить доступ к этому уже существующему набору данных вместо того, чтобы воссоздать его в 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
Ответы
Ответ 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
Ответ 2
Здесь абстракция Will Nathan ответит, если кто-то просто хочет добавить функцию надстройки:
function find (collec, query, callback) {
mongoose.connection.db.collection(collec, function (err, collection) {
collection.find(query).toArray(callback);
});
}
просто выполните find(collection_name, query, callback);
, чтобы получить результат.
например, если у меня есть документ {a: 1} в коллекции 'foo', и я хочу перечислить его свойства, я делаю это:
find('foo', {a : 1}, function (err, docs) {
console.dir(docs);
});
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ]
Ответ 3
У меня была такая же проблема, и мне удалось запустить запрос без схемы, используя существующее соединение 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);
Ответ 4
Вы можете сделать что-то подобное, чем вы, вы получите доступ к встроенным функциям mongodb внутри mongoose:
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
})
});
});
Ответ 5
Вы уверены, что подключились к db? (Я спрашиваю, потому что я не вижу указанный порт)
попробовать:
mongoose.connection.on("open", function(){
console.log("mongodb is connected!!");
});
Кроме того, вы можете сделать "коллекцию шоу" в оболочке mongo, чтобы просмотреть коллекции в своем db - возможно, попробуйте добавить запись через mongoose и посмотреть, где она заканчивается?
Из внешнего вида строки подключения вы должны увидеть запись в "test" db.
Надеюсь, что это поможет!
Ответ 6
Что-то еще, что было не очевидно, для меня, по крайней мере, заключалось в том, что при использовании третьего параметра Mongoose, чтобы избежать замены фактической коллекции на новую с тем же именем, new Schema(...)
на самом деле является только заполнителем и doesn не вмешиваться в схему exisitng, поэтому
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(...)
, и переменная почти наверняка не будет его взламывать.