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