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

在这种情况下,教义运行此查询:

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,您可以将查询类型切换为countbefore call getQuery

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