[node.js] 몽구스 모델의 모든 수를 얻는 방법?

데이터가 저장된 모델 수를 어떻게 알 수 있습니까? 의 방법이 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);


} 

다른 사람들을 도울 수 있기를 바랍니다. 🙂