몽구스 모델의 모든 수를 얻는 방법?


101

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

감사


1
ES 2016을 사용하는 경우 프로 미스 내에서 카운트하도록 호출을 래핑하고 생성기로 호출 할 수 있습니다.
mikeyGlitz

답변:


125

아래 코드가 작동합니다. 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);
      });
   }
 }); 

150

코드가 작동하지 않는 이유는 count 함수가 비동기식이고 값을 동 기적으로 반환하지 않기 때문입니다.

다음은 사용 예입니다.

userModel.count({}, function( err, count){
    console.log( "Number of users:", count );
})

나에게 방법의 동기 방식으로 계산 얻을 예를 부여
sankar muniyappa

저도 마찬가지입니다. 나는 같은 것을 찾고 있습니다
nowox

11
count메서드는 더 이상 사용되지 않습니다. countDocuments동일한 구문을 사용할 수 있습니다
Kir Novak

@KirNovak 감사합니다 형제. 또한 사용 중단을 위해 mongoose로 URL을 제공했습니다 .
Tes3awy

25

collection.count는 더 이상 사용되지 않으며 향후 버전에서 제거됩니다. 컬렉션을 사용하십시오. countDocuments 또는 컬렉션. estimatedDocumentCount 대신.

userModel.countDocuments(query).exec((err, count) => {
    if (err) {
        res.send(err);
        return;
    }

    res.json({ count: count });
});


프로젝트에서 모든 컬렉션의 기존 항목에 대한 설정 루틴 테스트가 문제가되었습니다. count () 메서드가 이상하게 작동했습니다. 컬렉션이 비어 있지 않을 때 가끔 아무것도 반환하지 않았습니다 (정의되지 않음, null, 0 또는 false-더 이상 조사 할 수 없음). 드물게 발생하는 경합 상태이기 때문에 문제의 원인을 아직 파악하지 못했습니다. 이제 countDocuments ({})를 사용하면 효과가 있습니다. 감사합니다!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function내 userModel에서 사용할 때 오류가 발생합니까?
Luke Brown

어떻게 "userModel.countDocuments"를 동기식 호출로 만들어서 내 문서에 "키와 값"을 추가하는 스키마에 가상을 추가 할 수 있습니다.
Satyam 19

25

개체를 인수로 제공해야합니다.

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

2
DeprecationWarning : collection.count는 더 이상 사용되지 않습니다. 대신 .estimatedDocumentCount () 또는 .countDocuments ()를 사용해야합니다.
HMagdy

9

솔루션의 배경

몽구스 문서와 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();

스택 오버플로로 학습,


1

여기에서 가장 많이 투표 한 답변은 완벽하게 괜찮습니다. 요청한 기능 을 보관할 수 있도록 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 );

-1

이전에 말했듯이 코드는 그대로 작동하지 않습니다. 이에 대한 해결책은 콜백 함수를 사용하는 것입니다. 그러나 그것이 당신을 '콜백 지옥'으로 데려 갈 것이라고 생각한다면 "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);


} 

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


computeNumberOfDoc () 함수에서 setNumberofDocuments (true)를 호출하는 이유는 무엇입니까? 실제 개수가 반환되기 전에도 먼저 오류가 발생하지 않습니까 ??
pravin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.