Как получить доступ к существующей коллекции с помощью 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(...), и переменная почти наверняка не будет его взламывать.