MongoDB ODM SELECT COUNT(*)等价物

chr*_*ris 12 doctrine-odm

我想知道是否有相当于MySQL-Query:

   "SELECT COUNT(*) FROM users" in MongoDB ODM?
Run Code Online (Sandbox Code Playgroud)

这可能有效:

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

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

小智 40

一小部分贡献:

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

$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
         ->getQuery()->execute()->count();
Run Code Online (Sandbox Code Playgroud)

Doctrine运行此查询:

db.collection.find();
Run Code Online (Sandbox Code Playgroud)

但是,如果代码如下:

$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
         ->count()->getQuery()->execute();
Run Code Online (Sandbox Code Playgroud)

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

db.collection.count();
Run Code Online (Sandbox Code Playgroud)

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

我希望这是有帮助的


Jam*_*and 23

$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
             ->getQuery()->execute()->count();
Run Code Online (Sandbox Code Playgroud)

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

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

渴望光标

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

主要

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