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(...)
하고 변수는 거의 해킹하지 않을 것입니다.
답변
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)