等价的MongoDB ODM SELECT COUNT(*)

问题描述 投票:13回答:3

我想知道是否有等同于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都会返回,如果数据库中有更复杂的文档,这会如何影响性能。我不想发送太多数据只是为了计数。

doctrine-odm
3个回答
23
投票
$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
             ->getQuery()->execute()->count();

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

方便使用的运算符是eagerCursor(true),它将在水合之前检索查询中的所有数据并关闭游标。如果您知道要获取的数据,并在查询后完成此操作,请使用此功能。

Eager Cursor

[如果您有参考资料,那么您将遍历。在它们上使用prime(true)方法。

Prime

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


41
投票

一小部分贡献:

如果您以此方式运行计数:

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

Doctrine运行此查询:

db.collection.find();

但是,如果代码如下:

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

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

db.collection.count();

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

希望对您有帮助


0
投票

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

    return $this->createQueryBuilder()
        ->field('storage')->equals($storage)
        ->field('priority')->in($priorities)
        ->count()
        ->getQuery()
        ->execute();
© www.soinside.com 2019 - 2024. All rights reserved.