Как получить доступ к существующей коллекции с Mongoose? - PullRequest
116 голосов
/ 26 апреля 2011

У меня есть большая коллекция из 300 question объектов в базе данных test. Я могу легко взаимодействовать с этой коллекцией через интерактивную оболочку MongoDB; однако, когда я пытаюсь получить коллекцию через Mongoose в приложении express.js, я получаю пустой массив.

Мой вопрос: как я могу получить доступ к этому уже существующему набору данных вместо того, чтобы воссоздать его в экспрессе? Вот некоторый код:

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 ]

223 голосов
/ 03 ноября 2011

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
55 голосов
/ 17 июля 2011

Вот абстракция ответа Уилла Натана, если кому-то нужна простая надстройка для копирования и вставки:

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 } ]
19 голосов
/ 25 октября 2016

Вы можете сделать что-то вроде этого, чем получить доступ к встроенным функциям 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
        })
    });

});
14 голосов
/ 06 июля 2011

У меня была та же проблема, и я смог выполнить запрос без схемы, используя существующее соединение 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);
6 голосов
/ 27 апреля 2011

Вы уверены, что подключены к БД? (Я спрашиваю, потому что я не вижу указанный порт)

попробовать:

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

Кроме того, вы можете выполнить «показ коллекций» в оболочке mongo, чтобы просмотреть коллекции в вашей базе данных - возможно, попробуйте добавить запись через mongoose и посмотреть, где она заканчивается?

По виду строки подключения вы должны увидеть запись в базе данных "test".

Надеюсь, это поможет!

2 голосов
/ 20 апреля 2016

Что-то еще, что было неочевидно, по крайней мере для меня, было то, что при использовании третьего параметра 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);});

работает нормально и возвращает все поля - даже если фактическая (удаленная) схема не содержит ни одно из этих полей. Mongoose по-прежнему будет хотеть его как new Schema(...), а переменная почти наверняка не взломает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...