14

MySQL-Queryに相当するものがあるかどうか疑問に思います。

   SELECT COUNT(*) FROM users

MongoDB ODMで?

これはうまくいくかもしれません:

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

ただし、すべてのIDが返されるわけではなく、データベースにさらに複雑なドキュメントがある場合、これはパフォーマンスにどのように影響しますか。カウントを取得するためだけに、あまり多くのデータを送信したくありません。

4

3 に答える 3

44

小さな貢献:

この方法でカウントを実行する場合:

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

Doctrineはこのクエリを実行します:

db.collection.find();

ただし、コードが次の場合:

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

この場合のDoctrineはこのクエリを実行します:

db.collection.count();

パフォーマンスが向上したかどうかはわかりませんが、最適だと思います

お役に立てば幸いです

于 2013-12-14T22:45:36.877 に答える
22
$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
             ->getQuery()->execute()->count();

上記は、ユーザーのコレクション内のドキュメントの数を示します。問題のクエリは、すべてのドキュメントを返し、それらをカウントするわけではありません。コレクションへのカーソルを生成し、そこからカウントを認識します。カーソルの反復を開始すると、ドライバーはデータベースからデータのプルを開始します。

パフォーマンスのための便利な演算子は、水和前にクエリ内のすべてのデータを取得してカーソルを閉じるeagerCursor(true)です。取得したいデータがわかっていて、クエリの後でそれを終了する場合は、これを使用します。

熱心なカーソル

繰り返し処理することがわかっている参照がある場合。それらにprime(true)メソッドを使用します。

プライム

すべての要素の生データを返したい場合は、クエリでhydrate(false)メソッドを使用して、ハイドレーションシステムを無効にすることができます。

于 2012-06-13T20:09:42.903 に答える
0

Doctrine ODM 2の場合、count呼び出し前にクエリタイプを切り替えることができgetQueryます。

    return $this->createQueryBuilder()
        ->field('storage')->equals($storage)
        ->field('priority')->in($priorities)
        ->count()
        ->getQuery()
        ->execute();
于 2019-12-19T06:37:03.207 に答える