Để tối ưu tốc độ đếm (count) cho trường thường xuyên lọc, hãy tạo index trên trường đó. Sau đó dùng find({field: value}).count() (hoặc countDocuments() mới).
Tạo index và dữ liệu
> db.demo311.ensureIndex({"Name":1});
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
> db.demo311.insertOne({"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50cd01f8647eb59e562044") }
> db.demo311.insertOne({"Name":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50cd05f8647eb59e562045") }
> db.demo311.insertOne({"Name":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50cd06f8647eb59e562046") }
> db.demo311.insertOne({"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50cd0af8647eb59e562047") }
> db.demo311.insertOne({"Name":"Bob"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50cd0df8647eb59e562048") }
> db.demo311.insertOne({"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50cd0ff8647eb59e562049") }
Xem dữ liệu
> db.demo311.find();
{ "_id" : ObjectId("5e50cd01f8647eb59e562044"), "Name" : "Chris" }
{ "_id" : ObjectId("5e50cd05f8647eb59e562045"), "Name" : "David" }
{ "_id" : ObjectId("5e50cd06f8647eb59e562046"), "Name" : "David" }
{ "_id" : ObjectId("5e50cd0af8647eb59e562047"), "Name" : "Chris" }
{ "_id" : ObjectId("5e50cd0df8647eb59e562048"), "Name" : "Bob" }
{ "_id" : ObjectId("5e50cd0ff8647eb59e562049"), "Name" : "Chris" }
Đếm số tài liệu Name="Chris"
> db.demo311.find({"Name":"Chris"}).count();
3
Lưu ý quan trọng:
ensureIndexđã cũ, dùngcreateIndex.count()trên cursor đã deprecated, dùngcountDocuments({Name:"Chris"})hoặcestimatedDocumentCount()(cho toàn collection).- Index đơn trường (single field index) trên
Namegiúp query{Name: "Chris"}và count chạy rất nhanh nhờ index scan thay vì collection scan.