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


139

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

답변:


252

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
Pleae는 다음과 같은 예제 쿼리를 제공합니다.Model.collection.insert();..
Steve K


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)) })
잭 빈

61

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

이는 API에서 통합 테스트를 실행할 때 매우 유용합니다.
Greg

안녕하세요, 이것은 원자 작업입니까? 그런 다음 콜백 함수에 문서를 저장하려고한다고 가정하십시오. 이것이 원자일까요?
Maulik Soneji

23

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
        })
    });

});

1
완벽한 답변!
CandleCoder

15

나는 같은 문제가 있었고 아래 코드로 기존 몽구스 연결을 사용하여 스키마가없는 쿼리를 실행할 수있었습니다. 간단한 제약 조건 '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
mongoose는 gridFS를 지원하지 않기 때문에 이것이 바로 내가 찾던 것입니다. 이 방법을 사용하여 gridfs (gridstore)에서 파일 메타 데이터를 가져옵니다. 그냥 교체 question와 위의 코드 fs.files와 넌 좋은 이동합니다.
k00k

7

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

시험:

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

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

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

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


4
흥미롭게도 questions액세스하려는 데이터 가 컬렉션에있을 때 실제로 컬렉션에 정보를 저장합니다 question. 몽구스는 컬렉션 / 모델 이름을 자동으로 복수화합니까?
theabraham

그래, 내 생각 엔 ... 하! 방금 나 자신을 시작하여 모든 구석 구석을 탐험하지는 못했지만 Google 그룹스를 돌면서 밤나무 바람을 본 적이 있습니다.
체포

3

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


1
그것은 '컬렉션 이름은 반드시 문자열이어야합니다'라는 오류를 발생시킵니다. 편집 : 'calvinfo'의 답변으로 모델 생성자에서 컬렉션 이름을 지정하려면 컬렉션 모델을 개체 모델이 아닌 문자열 형식으로 전달하면됩니다. 따라서 다음과 같이 편집하면 답이 맞습니다. var User = mongoose.model ( 'User', new Schema ({url : String, text : String, id : Number}, 'users')); // 컬렉션 이름; User.find ({}, function (err, data) {console.log (err, data, data.length);});
Kaan Erkoç
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.