데이터가 저장된 모델 수를 어떻게 알 수 있습니까? 의 방법이 Model.count()
있지만 작동하지 않는 것 같습니다.
var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new Schema({name:String,password:String});
userModel =db.model('UserList',userSchema);
var userCount = userModel.count('name');
userCount
어떤 메소드가 호출되어 진짜를 얻을 수 count
있습니까?
감사
답변
아래 코드가 작동합니다. countDocuments 사용에 유의하십시오 .
var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new mongoose.Schema({name:String,password:String});
var userModel =db.model('userlists',userSchema);
var anand = new userModel({ name: 'anand', password: 'abcd'});
anand.save(function (err, docs) {
if (err) {
console.log('Error');
} else {
userModel.countDocuments({name: 'anand'}, function(err, c) {
console.log('Count is ' + c);
});
}
});
답변
코드가 작동하지 않는 이유는 count 함수가 비동기식이고 값을 동 기적으로 반환하지 않기 때문입니다.
다음은 사용 예입니다.
userModel.count({}, function( err, count){
console.log( "Number of users:", count );
})
답변
collection.count는 더 이상 사용되지 않으며 향후 버전에서 제거됩니다. 컬렉션을 사용하십시오. countDocuments 또는 컬렉션. estimatedDocumentCount 대신.
userModel.countDocuments(query).exec((err, count) => {
if (err) {
res.send(err);
return;
}
res.json({ count: count });
});
답변
개체를 인수로 제공해야합니다.
userModel.count({name: "sam"});
또는
userModel.count({name: "sam"}).exec(); //if you are using promise
또는
userModel.count({}); // if you want to get all counts irrespective of the fields
최신 버전의 mongoose에서는 count ()가 더 이상 사용되지 않으므로 다음을 사용하십시오.
userModel.countDocuments({name: "sam"});
답변
솔루션의 배경
몽구스 문서와 Benjamin의 답변에 명시된 것처럼이 메서드 Model.count()
는 더 이상 사용되지 않습니다. 를 사용하는 대신 count()
대안은 다음과 같습니다.
Model.countDocuments(filterObject, callback)
컬렉션의 필터와 일치하는 문서 수를 계산합니다. 빈 개체 {}를 필터로 전달하면 전체 컬렉션 검색이 실행됩니다. 컬렉션이 큰 경우 다음 방법을 사용할 수 있습니다.
Model.estimatedDocumentCount()
이 모델 방법은 MongoDB 컬렉션의 문서 수를 추정합니다. 이 방법은 countDocuments()
전체 컬렉션을 거치지 않고 컬렉션 메타 데이터를 사용하기 때문에 이전 . 그러나 메서드 이름에서 알 수 있듯이 db 구성에 따라 메타 데이터가 메서드 실행 시점에 컬렉션의 실제 문서 수를 반영하지 않을 수 있으므로 결과는 추정치입니다.
두 메소드 모두 몽구스 쿼리 객체를 반환하며 다음 두 가지 방법 중 하나로 실행할 수 있습니다. .exec()
나중에 쿼리를 실행하려는 경우 사용 합니다.
해결책
옵션 1 : 콜백 함수 전달
예를 들어 다음을 사용하여 컬렉션의 모든 문서를 계산합니다 .countDocuments()
.
someModel.countDocuments({}, function(err, docCount) {
if (err) { return handleError(err) } //handle possible errors
console.log(docCount)
//and do some other fancy stuff
})
또는 .countDocuments()
다음을 사용하여 특정 이름을 가진 컬렉션의 모든 문서를 계산합니다 .
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
//see other example
}
옵션 2 : 사용 .then()
몽구스 쿼리에는 .then()
“그때”입니다. 이것은 편의를위한 것이며 쿼리 자체는 약속이 아닙니다.
예를 들어 다음을 사용하여 컬렉션의 모든 문서를 계산합니다 .estimatedDocumentCount()
.
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
옵션 3 : async / await 사용
async / await 접근 방식 을 사용할 때 권장되는 방법은 .exec()
더 나은 스택 추적을 제공 하므로 함께 사용하는 것입니다 .
const docCount = await someModel.countDocuments({}).exec();
스택 오버플로로 학습,
답변
여기에서 가장 많이 투표 한 답변은 완벽하게 괜찮습니다. 요청한 기능 을 보관할 수 있도록 await 사용을 추가하고 싶습니다 .
const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );
계속해서 더 이상 사용되지 않으므로 ‘count ()’보다 countDocuments () 를 사용하는 것이 좋습니다 . 따라서 현재 완벽한 코드는 다음과 같습니다.
const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );
답변
이전에 말했듯이 코드는 그대로 작동하지 않습니다. 이에 대한 해결책은 콜백 함수를 사용하는 것입니다. 그러나 그것이 당신을 ‘콜백 지옥’으로 데려 갈 것이라고 생각한다면 “Promisses”를 검색 할 수 있습니다.
콜백 함수를 사용하는 가능한 솔루션 :
//DECLARE numberofDocs OUT OF FUNCTIONS
var numberofDocs;
userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection
쿼리를 기반으로 문서 수를 검색하려는 경우 다음을 수행 할 수 있습니다.
userModel.count({yourQueryGoesHere}, setNumberofDocuments);
setNumberofDocuments는 분리 된 함수입니다.
var setNumberofDocuments = function(err, count){
if(err) return handleError(err);
numberofDocs = count;
};
이제 getFunction을 사용하여 어디서나 문서 수를 가져올 수 있습니다.
function getNumberofDocs(){
return numberofDocs;
}
var number = getNumberofDocs();
또한 콜백을 사용하여 동기식 함수 내에서이 비동기 함수를 사용합니다. 예 :
function calculateNumberOfDoc(someParameter, setNumberofDocuments){
userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection
setNumberofDocuments(true);
}
다른 사람들을 도울 수 있기를 바랍니다. 🙂