web-dev-qa-db-ja.com

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

データが保存されたモデルの数を知るにはどうすればよいですか? 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を取得できますか?

ありがとう

86
smilexu

以下のコードが機能します。 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);
      });
   }
 }); 
107
almypal

コードが機能しない理由は、カウント関数が非同期であり、同期的に値を返さないためです。

以下に使用例を示します。

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

Collection.countは非推奨であり、将来のバージョンで削除される予定です。代わりにcollection .countDocumentsまたはcollection .estimatedDocumentCountを使用してください。

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

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

引数としてオブジェクトを指定する必要があります

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

MongooseのドキュメントとBenjaminの回答で述べられているように、メソッド Model.count() は非推奨です。 count()を使用する代わりに、代替手段は次のとおりです。

Model.countDocuments(filterObject、callback)

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

Model.estimatedDocumentCount()

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

両方のメソッドは、次の2つの方法のいずれかで実行できるマングースクエリオブジェクトを返します。後でクエリを実行する場合は、.exec()を使用します。

1)コールバック関数を渡す

たとえば、.countDocuments():を使用してコレクション内のすべてのドキュメントをカウントします

SomeModel.countDocuments({}, function(err, count) {
    if (err) { return handleError(err) } //handle possible errors
    console.log(count)
    //and do some other fancy stuff
})

または、.countDocuments():を使用して、特定の名前を持つコレクション内のすべてのドキュメントをカウントします

SomeModel.countDocuments({ name: 'Snow' }, function(err, count) {
    //see other example
}

2).then()を使用する

マングースクエリには.then()があるため、「thenable」になります。これは便宜上のものであり、クエリ自体は約束ではありません。

たとえば、.estimatedDocumentCount():を使用してコレクション内のすべてのドキュメントをカウントします

SomeModel
    .estimatedDocumentCount()
    .then(count => {
        console.log(count)
        //and do one super neat trick
    })
    .catch(err => {
        //handle possible errors
    })

お役に立てれば!

7
heilala