Làm thế nào để có được tất cả số lượng mô hình mongoose?


101

Làm thế nào tôi có thể biết số lượng của một mô hình mà dữ liệu đã được lưu? có một phương pháp Model.count(), nhưng nó dường như không hoạt động.

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

userCountlà một đối tượng, phương thức nào được gọi là có thể nhận được một thực count?

Cảm ơn


1
Nếu bạn đang sử dụng ES 2016, bạn có thể kết thúc cuộc gọi để đếm bên trong một lời hứa và gọi nó bằng một trình tạo.
mikeyGlitz

Câu trả lời:


125

Đoạn mã dưới đây hoạt động. Lưu ý việc sử dụng 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

Nguyên nhân khiến mã của bạn không hoạt động là vì hàm đếm không đồng bộ, nó không đồng bộ trả về một giá trị.

Đây là một ví dụ về cách sử dụng:

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

Hãy cho tôi ví dụ để có được đếm cách đồng bộ của phương pháp
muniyappa Sankar

Tương tự cho tôi. Tôi đang tìm kiếm điều tương tự
nowox

11
countphương pháp được depricated, bạn có thể sử dụng countDocumentscùng một cú pháp
Kir Novak

@KirNovak Cảm ơn người anh em. Tôi cũng đã cung cấp url trong mongoose để không dùng nữa .
Tes3awy

25

Collection.count không được dùng nữa và sẽ bị xóa trong phiên bản trong tương lai. Sử dụng bộ sưu tập. số lượngTài liệu hoặc bộ sưu tập. ước tínhDocumentCount thay thế.

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

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


Tôi gặp sự cố, đó là trong dự án của chúng tôi, một bài kiểm tra thường xuyên thiết lập cho các mục hiện có trong bất kỳ bộ sưu tập nào. Phương thức count () hoạt động kỳ lạ: khi bộ sưu tập không trống, đôi khi nó không trả về gì (không xác định, null, không hoặc sai - chúng tôi không thể điều tra thêm). Chúng tôi vẫn không tìm ra nguyên nhân gây ra sự cố vì đây là một điều kiện đua rất hiếm khi xảy ra. Việc sử dụng countDocuments ({}) hiện có hiệu quả với chúng tôi. Cảm ơn bạn!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionTôi gặp lỗi khi sử dụng nó trên userModel của riêng mình?
Luke Brown

Làm cách nào chúng ta có thể gọi "userModel.countDocuments" dưới dạng lệnh gọi đồng bộ để tôi có thể thêm ảo vào lược đồ để thêm một số "khóa & giá trị" trong tài liệu của mình.
Satyam

25

Bạn nên đưa một đối tượng làm đối số

userModel.count({name: "sam"});

hoặc là

userModel.count({name: "sam"}).exec(); //if you are using promise

hoặc là

userModel.count({}); // if you want to get all counts irrespective of the fields

Trên phiên bản gần đây của mongoose, count () không được dùng nữa nên hãy sử dụng

userModel.countDocuments({name: "sam"});

2
DeprecationWarning: collection.count không được dùng nữa, thay vào đó bạn nên sử dụng .estimatedDocumentCount () hoặc .countDocuments ().
HMagdy 23/07/19

9

Nền tảng cho giải pháp

Như đã nêu trong tài liệu mongoose và trong câu trả lời của Benjamin, phương pháp Model.count()này không được chấp nhận. Thay vì sử dụng count(), các lựa chọn thay thế là:

Model.countDocuments(filterObject, callback)

Đếm số lượng tài liệu phù hợp với bộ lọc trong một bộ sưu tập. Chuyển một đối tượng trống {} khi bộ lọc thực hiện quét toàn bộ bộ sưu tập. Nếu bộ sưu tập lớn, phương pháp sau có thể được sử dụng.

Model.estimatedDocumentCount()

Phương pháp mô hình này ước tính số lượng tài liệu trong bộ sưu tập MongoDB. Phương pháp này nhanh hơn phương pháp trước countDocuments()vì nó sử dụng siêu dữ liệu bộ sưu tập thay vì đi qua toàn bộ bộ sưu tập. Tuy nhiên, như tên phương pháp gợi ý, và tùy thuộc vào cấu hình db, kết quả là một ước tính vì siêu dữ liệu có thể không phản ánh số lượng tài liệu thực tế trong một bộ sưu tập tại thời điểm thực thi phương pháp.

Cả hai phương thức đều trả về một đối tượng truy vấn mongoose, đối tượng này có thể được thực thi theo một trong hai cách sau. Sử dụng .exec()nếu bạn muốn thực hiện truy vấn sau này.

Giải pháp

Tùy chọn 1: Chuyển chức năng gọi lại

Ví dụ: đếm tất cả các tài liệu trong một bộ sưu tập bằng cách sử dụng .countDocuments():

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

Hoặc, đếm tất cả các tài liệu trong một bộ sưu tập có một tên nhất định bằng cách sử dụng .countDocuments():

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

Tùy chọn 2: Sử dụng .then()

Một truy vấn mongoose có .then()vì vậy nó là "có thể". Điều này là để thuận tiện và bản thân truy vấn không phải là một lời hứa.

Ví dụ: đếm tất cả các tài liệu trong một bộ sưu tập bằng cách sử dụng .estimatedDocumentCount():

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

Tùy chọn 3: Sử dụng async / await

Khi sử dụng cách tiếp cận async / await, cách được khuyến nghị là sử dụng nó với .exec()vì nó cung cấp dấu vết ngăn xếp tốt hơn.

const docCount = await someModel.countDocuments({}).exec();

Học bằng cách xếp chồng lên nhau,


1

Các câu trả lời được bình chọn cao nhất ở đây là hoàn toàn tốt. Tôi chỉ muốn thêm vào việc sử dụng await để chức năng được yêu cầu có thể được lưu trữ:

const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );

Bạn nên sử dụng countDocuments () thay vì 'count ()' vì nó sẽ không còn được dùng nữa. Vì vậy, hiện tại, mã hoàn hảo sẽ là:

const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );

-1

Như đã nói trước đây, mã của bạn sẽ không hoạt động theo cách của nó. Một giải pháp cho điều đó sẽ là sử dụng hàm gọi lại, nhưng nếu bạn nghĩ rằng nó sẽ đưa bạn đến 'địa ngục gọi lại', bạn có thể tìm kiếm "Promisses".

Một giải pháp khả thi bằng cách sử dụng hàm gọi lại:

//DECLARE  numberofDocs OUT OF FUNCTIONS
     var  numberofDocs;
     userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

nếu bạn muốn tìm kiếm số lượng tài liệu dựa trên một truy vấn, bạn có thể thực hiện điều này:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments là một hàm riêng biệt:

var setNumberofDocuments = function(err, count){ 
        if(err) return handleError(err);

        numberofDocs = count;

      };

Giờ đây, bạn có thể lấy số lượng Tài liệu ở bất kỳ đâu với getFunction:

     function getNumberofDocs(){
           return numberofDocs;
        }
 var number = getNumberofDocs();

Ngoài ra, bạn sử dụng hàm không đồng bộ này bên trong hàm đồng bộ bằng cách sử dụng lệnh gọi lại, ví dụ:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

       userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

       setNumberofDocuments(true);


} 

Hy vọng nó có thể giúp ích cho những người khác. :)


Trong hàm tínhNumberOfDoc (), tại sao bạn lại gọi setNumberofDocuments (true)? Nó sẽ không dẫn đến lỗi trước, ngay cả trước khi số lượng thực được trả về ??
pravin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.