マングースモデルのすべてのカウントを取得する方法?


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を使用している場合は、呼び出しをラップしてpromise内でカウントし、ジェネレーターで呼び出すことができます。
mikeyGlitz 2016

回答:


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 '11

わたしも。私は同じを探しています
nowox

11
countメソッドは廃止され、countDocuments同じ構文を使用できます
Kir Novak

@KirNovak仲間に感謝します。また、サポート終了のためにマングースのURLを提供しました。
Tes3awy 2018

25

collection.countは非推奨であり、将来のバージョンで削除される予定です。コレクションを使用します。countDocumentsまたはコレクション。代わりに見積もられた DocumentCount。

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

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

3
:ここでのドキュメントのリンクですmongoosejs.com/docs/api.html#model_Model.estimatedDocumentCount
babar78

私の問題は、私たちのプロジェクトで、コレクション内の既存の項目についてセットアップルーチンテストを行うことでした。count()メソッドは奇妙な動作をしました:コレクションが空ではない場合、時々何も返しません(未定義、null、0またはfalse-それ以上調査できませんでした)。非常にまれにしか発生しない競合状態だったため、問題の原因はまだわかりませんでした。countDocuments({})の使用が機能するようになりました。ありがとうございました!
ha110_b1mm3lbahn 2018年

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function自分のuserModelで使用するとエラーが発生しますか?
ルークブラウン

ドキュメントに「キーと値」を追加するスキーマに仮想を追加できるように、「userModel.countDocuments」を同期呼び出しとして作成するにはどうすればよいですか。
Satyam

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

ソリューションの背景

マングースのドキュメントとベンジャミンの回答で述べられているように、このメソッドModel.count()は非推奨です。を使用する代わりにcount()、代替方法は次のとおりです。

Model.countDocuments(filterObject, callback)

コレクション内のフィルターに一致するドキュメントの数をカウントします。空のオブジェクト{}をフィルターとして渡すと、完全なコレクションスキャンが実行されます。コレクションが大きい場合は、次の方法を使用できます。

Model.estimatedDocumentCount()

このモデルメソッドは、MongoDBコレクション内のドキュメント数を推定します。この方法は以前よりも高速ですcountDocuments()、コレクション全体を処理する代わりにコレクションメタデータを使用するため。ただし、メタデータはメソッド実行時のコレクション内のドキュメントの実際の数を反映していない可能性があるため、メソッド名が示すように、db構成によっては、結果は推定値です。

どちらのメソッドも、次の2つの方法のいずれかで実行できるマングースクエリオブジェクトを返します。.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()「thenable」があります。これは便宜上のものであり、クエリ自体は約束ではありません。

たとえば、次のコマンドを使用して、コレクション内のすべてのドキュメントをカウントします.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

前に述べたように、コードはそのままでは機能しません。これに対する解決策はコールバック関数を使用することですが、それが「コールバック地獄」にあなたを連れて行くだろうと思うなら、「約束」を検索することができます。

コールバック関数を使用した可能な解決策:

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


} 

他の人の役に立つことを願っています。:)


関数calculateNumberOfDoc()で、なぜsetNumberofDocuments(true)を呼び出すのですか?実際のカウントが返される前であっても、最初にエラーになることはありませんか?
プラビン2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.