ความเป็นมาของการแก้ปัญหา
ตามที่ระบุไว้ในเอกสารพังพอนและในคำตอบของเบนจามินวิธี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) }
console.log(docCount)
})
หรือนับเอกสารทั้งหมดในคอลเล็กชันที่มีชื่อเฉพาะโดยใช้.countDocuments()
:
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
}
ตัวเลือกที่ 2: ใช้ .then()
คำค้นหาพังพอนมี .then()
ดังนั้นจึง "ใช้แล้วได้" เพื่อความสะดวกและการสืบค้นนั้นไม่ใช่คำมั่นสัญญา
ตัวอย่างเช่นนับเอกสารทั้งหมดในคอลเล็กชันโดยใช้.estimatedDocumentCount()
:
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
})
.catch(err => {
})
ตัวเลือกที่ 3: ใช้ async / await
เมื่อใช้วิธี async / await วิธีที่แนะนำคือใช้ร่วมกับ.exec()
สแต็กเทรซที่ดีกว่า
const docCount = await someModel.countDocuments({}).exec();
การเรียนรู้โดยการซ้อนทับ