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

У меня есть большая коллекция из 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 Solutions collect form web for “Как получить доступ к существующей коллекции с помощью Mongoose?”

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 

Вот абстракция ответа Уилла Натана, если кто-то просто хочет использовать функцию надстройки «copy-paste»:

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

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

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

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

пытаться:

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

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

С точки зрения вашей строки подключения вы должны увидеть запись в «test» db.

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

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

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

  • Использование Express и узла, как поддерживать сеанс по субдоменам / хост-узлам
  • Как получить доступ к параметрам GET после «?» В Express?
  • Обновите Node.js до последней версии на Mac OS
  • В чем разница между зависимостями, devDependencies и peerDependencies в файле npm package.json?
  • Ошибка Heroku + node.js (веб-процесс не смог привязываться к $ PORT в течение 60 секунд после запуска)
  • Запрос после заполнения в Mongoose
  • FATAL ERROR: CALL_AND_RETRY_LAST Не удалось выполнить выделение - процесс из памяти
  • Как заставить Fish shell и NVM установить вместе с Homebrew для совместной работы?
  • NodeJS требует глобального модуля / пакета
  • Как я могу построить свой тестовый пакет асинхронно?
  • Node.js, невозможно открыть файлы. Ошибка: ENOENT, stat './path/to/file'
  • Давайте будем гением компьютера.