[mongodb] Mongoose로 기존 컬렉션에 액세스하는 방법은 무엇입니까?

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

내 질문은,이 기존 데이터 세트를 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



답변

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


답변

누구나 쉽게 복사하여 붙여 넣기 추가 기능을 원하는 경우 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 } ]


답변

mongoose 내부의 기본 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
        })
    });

});


답변

나는 같은 문제가 있었고 아래 코드로 기존 몽구스 연결을 사용하여 스키마가없는 쿼리를 실행할 수있었습니다. 간단한 제약 조건 ‘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);


답변

DB에 연결 되었습니까? (포트가 보이지 않아서 묻습니다)

시험:

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

또한 mongo 셸에서 “show collections”를 수행하여 db 내의 컬렉션을 볼 수 있습니다. mongoose를 통해 레코드를 추가하고 레코드가 어디에서 보이는지 볼 수 있습니까?

연결 문자열을 보면 “test”db에 레코드가 표시되어야합니다.

그것이 도움이되기를 바랍니다!


답변

나에게 분명하지 않은 것은 몽구스의 세 번째 매개 변수를 사용하여 실제 컬렉션을 동일한 이름의 새로운 컬렉션으로 바꾸지 않고 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);});

실제 (원격) 스키마에 이러한 필드가 포함되어 있지 않더라도 제대로 작동하고 모든 필드를 반환합니다. 몽구스는 여전히을 (를) 원 new Schema(...)하고 변수는 거의 해킹하지 않을 것입니다.


답변