Vì bạn không cần số lượng, bạn nên đảm bảo rằng truy vấn sẽ trở lại sau khi tìm thấy kết quả phù hợp đầu tiên. Vì hiệu suất đếm không phải là lý tưởng, điều đó khá quan trọng. Truy vấn sau sẽ thực hiện được điều đó:
db.Collection.find({ /* criteria */}).limit(1).size();
Lưu ý rằng find().count()
theo mặc định thì không tôn trọng limit
và do đó có thể trả về kết quả không mong muốn (và sẽ cố gắng tìm tất cả các kết quả phù hợp). size()
hoặc count(true)
sẽ tôn trọng cờ giới hạn.
Nếu bạn muốn đi đến cực trị, bạn nên đảm bảo rằng truy vấn của bạn sử dụng các chỉ mục được bao phủ. Các chỉ mục được bao phủ chỉ truy cập vào chỉ mục, nhưng chúng yêu cầu trường bạn truy vấn phải được lập chỉ mục. Nói chung, điều đó nên làm vì một count()
rõ ràng là không trả về bất kỳ trường nào. Tuy nhiên, các chỉ mục được đề cập đôi khi cần con trỏ khá dài dòng:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Rất tiếc, count()
không cung cấp explain()
, vì vậy nó có xứng đáng hay không là điều khó nói. Như thường lệ, đo lường là người bạn đồng hành tốt hơn lý thuyết, nhưng lý thuyết ít nhất có thể giúp bạn thoát khỏi những vấn đề lớn hơn.