2012-06-11 29 views
12

Tôi tự hỏi nếu có một tương đương với MySQL-Query:MongoDB ODM SELECT COUNT (*) tương đương

"SELECT COUNT(*) FROM users" in MongoDB ODM? 

này có thể làm việc:

$qb = $this->dm->createQueryBuilder('Documents\Functional\Users'); 
$qb->select('id'); 
$query = $qb->getQuery(); 
$results = $query->execute(); 
echo $query->count(); 

Nhưng không sau đó tất cả các ID trở lại và điều này ảnh hưởng như thế nào đến hiệu suất nếu có nhiều tài liệu phức tạp hơn trong cơ sở dữ liệu. Tôi không muốn gửi nhiều dữ liệu xung quanh chỉ để có được một số.

Trả lời

22
$count = $this->dm->createQueryBuilder('Documents\Functional\Users') 
      ->getQuery()->execute()->count(); 

Ở trên sẽ cung cấp cho bạn số lượng tài liệu bên trong bộ sưu tập Người dùng. Truy vấn được đề cập không trả lại tất cả tài liệu và sau đó đếm chúng. Nó tạo ra một con trỏ đến bộ sưu tập và từ đó nó biết đếm. Chỉ khi bạn bắt đầu lặp qua con trỏ thì trình điều khiển bắt đầu lấy dữ liệu từ cơ sở dữ liệu.

Toán tử tiện dụng cho hiệu suất là eagerCursor (đúng) sẽ lấy tất cả dữ liệu trong truy vấn trước khi hydrat hóa và đóng con trỏ. Sử dụng điều này nếu bạn biết dữ liệu bạn muốn nhận và bạn sẽ hoàn thành nó sau khi truy vấn.

Eager Cursor

Nếu bạn có tài liệu tham khảo mà bạn biết bạn sẽ lặp lại. Sử dụng phương thức chính (đúng) trên chúng.

Prime

Nếu bạn muốn trả lại tất cả các yếu tố dữ liệu thô, bạn có thể sử dụng hydrate (false) phương pháp trong các truy vấn để vô hiệu hóa các hệ thống hydrat hóa.

+0

Woa, lấy tất cả các tài liệu và đếm chúng ;-( –

36

Một đóng góp nhỏ:

nếu bạn chạy đếm theo cách này:

$count = $this->dm->createQueryBuilder('Documents\Functional\Users') 
     ->getQuery()->execute()->count(); 

thuyết chạy truy vấn này:

db.collection.find(); 

Tuy nhiên, nếu mã là như sau:

$count = $this->dm->createQueryBuilder('Documents\Functional\Users') 
     ->count()->getQuery()->execute(); 

Giáo lý trong trường hợp này chạy truy vấn này:

db.collection.count(); 

Tôi không biết nếu có sự cải tiến trong hiệu suất, nhưng tôi nghĩ rằng tối ưu nhất

Tôi hy vọng đó là hữu ích

+0

nhờ một lotttt –

+0

Đây là một đối số hợp lệ. Sử dụng -> count() -> getQuery() -> execute(); là con đường để đi. – Dayson

+0

Từ cách các tài liệu được viết cho ['db.collection.count()'] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) và ['cursor.count() '] (http://docs.mongodb.org/manual/reference/method/cursor.count/) có vẻ như nó không có sự khác biệt. Đối với cả hai, "trả về số lượng tài liệu phù hợp với truy vấn' find() '., Ngụ ý một trong hai sẽ gọi' find() 'cuối cùng. –

Các vấn đề liên quan