Як отримати доступ до вже існуючої колекції за допомогою Mongoose?


139

У мене велика колекція з 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

Відповіді:


251

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

9
Де в документах я можу знайти цю інформацію? Це справді допомогло, але немає місця, де пояснюється множина.
StudioWorks

Привіт, @calvinfo Як я можу змінити ім'я колекції під час виконання? У мене є 5 колекцій UserSchema, і я хочу дати кожному назвати інше ім’я Напр .: users_server1, users_server2, users_server3 ...
Ragnar

1
Просимо навести приклад запиту, наприклад, ізModel.collection.insert();..
Steve K

6
Тут же я витрачаю багато годин, розбираючись у цьому питанні, документ тут знайдено mongoosejs.com/docs/guide.html#collection
ElvinD

3
Це працювало для мене. У мене була колекція користувачів, якою я керувався. Щоб отримати доступ до нього з мангустом, я зробивmongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
jack blank

61

Ось абстракція відповіді Вілла Натана, якщо хтось просто хоче просту функцію надбудови для копіювання та вставки:

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 } ]

Це дуже корисно при запуску інтеграційних тестів в API
Грег,

привіт, це атомна операція? Припустимо, я спробую потім зберегти документ у функції зворотного дзвінка. це буде атомним?
Maulik Soneji

23

Ви можете зробити щось подібне, ніж ви отримаєте доступ до нативних функцій 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
        })
    });

});

1
Ідеальна відповідь!
CandleCoder

15

У мене була така ж проблема, і я міг запустити запит без схем, використовуючи існуюче з'єднання 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);

1
Це саме те, що я шукав, тому що мангуст не підтримує gridFS. Я використовую цей метод, щоб захопити метадані файлів з gridfs (gridstore). Просто замініть questionу наведеному вище коді на, fs.filesі ви готові йти.
k00k

7

Ви впевнені, що підключились до db? (Запитую, бо не бачу порту, вказаного)

спробуйте:

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

Крім того, ви можете зробити "показати колекції" в оболонці mongo, щоб побачити колекції всередині вашого db - можливо, спробуйте додати запис через мангуст і подивитися, де він закінчується?

З вигляду рядка з'єднання ви повинні побачити запис у "тестовому" db.

Сподіваюся, це допомагає!


4
Цікаво, що насправді це зберігання інформації в questionsколекції, коли дані, до яких я намагаюся отримати доступ, є в questionколекції. Чи автоматично Mongoose плюралізує назви колекцій / моделей?
theabraham

Так, я думаю, що це ... га! Я тільки починаю сам, тому я не досліджував усіх куточків і балахонів ... але я пам'ятаю, як побачив цей вітер каштанового вітру, коли я крутився через Google Групи.
перепохований

3

Щось ще, що мені було не очевидним, принаймні для мене, це те, що при використанні третього параметра Mongoose, щоб уникнути заміни фактичної колекції на нову з тим же ім'ям, new Schema(...)насправді є лише заповнювачем, і не заважає 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);});

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


1
це дає мені помилку "ім'я колекції повинне бути рядковим", Редагувати: як відповідь "calvinfo". Якщо ви хочете дати ім'я колекції в конструкторі моделі, ви просто передасте ім'я колекції у рядковій формі, а не об'єктній моделі. тож ваша відповідь буде вірною, якщо редагувати так, var User = mongoose.model ('Користувач', нова схема ({url: String, text: String, id: Number}, 'users')); // назва колекції; User.find ({}, функція (помилка, дані) {console.log (помилка, дані, дані. довжина);});
Каан Еркоч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.