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,