我想知道是否有与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,如果数据库中有更复杂的文档,这会如何影响性能。我不想发送大量数据只是为了计算。
答案 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),它将在水化之前检索查询中的所有数据并关闭光标。如果您知道要获取的数据,请使用此选项,并在查询后完成它。
如果你有引用,你知道你会迭代。对它们使用 prime(true)方法。
如果要返回所有元素原始数据,可以在查询中使用 hydrate(false)方法来禁用水化系统。
答案 2 :(得分:0)
对于Doctrine ODM 2,您可以在调用count
之前将查询类型切换为getQuery
:
return $this->createQueryBuilder()
->field('storage')->equals($storage)
->field('priority')->in($priorities)
->count()
->getQuery()
->execute();