我想知道是否有等同于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都会返回,如果数据库中有更复杂的文档,这会如何影响性能。我不想发送太多数据只是为了计数。
$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
->getQuery()->execute()->count();
以上将为您提供一组用户中的文档数量。有问题的查询不会返回所有文档,然后对它们进行计数。它生成一个光标到集合,并从那里知道计数。仅当您开始遍历游标时,驱动程序才开始从数据库中提取数据。
方便使用的运算符是eagerCursor(true),它将在水合之前检索查询中的所有数据并关闭游标。如果您知道要获取的数据,并在查询后完成此操作,请使用此功能。
[如果您有参考资料,那么您将遍历。在它们上使用prime(true)方法。
如果要返回所有元素原始数据,则可以在查询中使用hydrate(false)方法禁用水合系统。
一小部分贡献:
如果您以此方式运行计数:
$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();
我不知道性能是否有所改善,但我认为是最佳选择
希望对您有帮助
对于Doctrine ODM 2,您可以在调用count
之前将查询类型切换为getQuery
:
return $this->createQueryBuilder()
->field('storage')->equals($storage)
->field('priority')->in($priorities)
->count()
->getQuery()
->execute();