Как получить доступ к уже существующей коллекции с Мангустом?



у меня есть большая коллекция из 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
1055   6  

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(...) на самом деле является только заполнителем и не вмешивается в существующую схему so

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(...), и переменная почти наверняка не будет взломать оно.

Comments

    Ничего не найдено.