[mongodb] Mongoose로 기존 컬렉션에 액세스하는 방법?


Answers

다음은 누구나 손쉬운 복사 - 붙여 넣기 추가 기능을 원한다면 Will Nathan의 대답을 추상화 한 것입니다.

function find (name, query, cb) {
    mongoose.connection.db.collection(name, function (err, collection) {
       collection.find(query).toArray(cb);
   });
}

간단히 find(collection_name, query, callback); 결과가 주어진다.

예를 들어 컬렉션 'foo'에 문서 {a : 1}이 있고 해당 속성을 나열하려면 다음과 같이하십시오.

find('foo', {a : 1}, function (err, docs) {
            console.dir(docs);
        });
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ]
Question

데이터베이스 test 에는 300 개의 question 객체가 있습니다. MongoDB의 대화 형 쉘을 통해이 컬렉션과 쉽게 상호 작용할 수 있습니다. 그러나 express.js 응용 프로그램에서 Mongoose를 통해 콜렉션을 가져 오려고하면 빈 배열이 생깁니다.

내 질문은 표현식에서 다시 작성하는 대신 기존의 데이터 세트에 어떻게 액세스 할 수 있습니까? 여기에 몇 가지 코드가 있습니다.

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



몽구스 내부의 원시 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의 세 번째 매개 변수를 사용하여 실제 컬렉션을 동일한 이름으로 새 컬렉션으로 바꾸지 않는 경우 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(...) 로 그것을 원할 것이고, 변수는 거의 그것을 해킹하지 않을 것입니다.




Related