MongoDB ODM SELECT COUNT(*)等价物

时间:2012-06-11 10:18:32

标签: doctrine-odm

我想知道是否有与MySQL-Query相同的东西:

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

这可能有效:

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

但是还没有返回所有ID,如果数据库中有更复杂的文档,这会如何影响性能。我不想发送大量数据只是为了计算。

3 个答案:

答案 0 :(得分:39)

一个小小的贡献:

如果你以这种方式运行计数:

$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();

我不知道性能是否有所改善,但我认为最佳

我希望这很有用

答案 1 :(得分:23)

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

以上内容将为您提供用户集合中的文档数量。有问题的查询不会返回所有文档,然后对它们进行计数。它会为集合生成一个游标,并从那里知道计数。只有在您开始迭代光标后,驱动程序才会开始从数据库中提取数据。

一个方便的运算符是 eagerCursor(true),它将在水化之前检索查询中的所有数据并关闭光标。如果您知道要获取的数据,请使用此选项,并在查询后完成它。

Eager Cursor

如果你有引用,你知道你会迭代。对它们使用 prime(true)方法。

Prime

如果要返回所有元素原始数据,可以在查询中使用 hydrate(false)方法来禁用水化系统。

答案 2 :(得分:0)

对于Doctrine ODM 2,您可以在调用count之前将查询类型切换为getQuery

    return $this->createQueryBuilder()
        ->field('storage')->equals($storage)
        ->field('priority')->in($priorities)
        ->count()
        ->getQuery()
        ->execute();