MongoDB ODM选择计数(*)等效

MongoDB ODM选择计数(*)等效,mongodb,doctrine-odm,Mongodb,Doctrine Odm,我想知道是否有一个与MySQL查询等价的查询: 从用户中选择计数(*) 在MongoDB ODM中 这可能会奏效: $qb=$this->dm->createQueryBuilder('Documents\Functional\Users'); $qb->选择('id'); $query=$qb->getQuery(); $results=$query->execute(); echo$query->count(); 但若数据库中有更复杂的文档,那个么并没有返回所有的ID,这会如何影响性能。

我想知道是否有一个与MySQL查询等价的查询:

从用户中选择计数(*)
在MongoDB ODM中

这可能会奏效:

$qb=$this->dm->createQueryBuilder('Documents\Functional\Users');
$qb->选择('id');
$query=$qb->getQuery();
$results=$query->execute();
echo$query->count();
但若数据库中有更复杂的文档,那个么并没有返回所有的ID,这会如何影响性能。我不想为了计数而发送太多数据

$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
             ->getQuery()->execute()->count();
上面将给出用户集合中的文档数。有问题的查询不会返回所有文档,然后对它们进行计数。它生成一个指向集合的游标,并从那里知道计数。只有当您开始迭代光标时,驱动程序才会开始从数据库中提取数据

一个方便的性能操作符是游标(true),它将在查询之前检索查询中的所有数据并关闭游标。如果您知道要获取的数据,并且在查询完成后就可以使用它

如果你有你知道你将要迭代的引用。对它们使用prime(true)方法

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

小贡献:

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

$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
         ->getQuery()->execute()->count();
条令运行此查询:

db.collection.find();
db.collection.count();
但是,如果代码如下所示:

$count = $this->dm->createQueryBuilder('Documents\Functional\Users')
         ->count()->getQuery()->execute();
在本例中,请运行此查询:

db.collection.find();
db.collection.count();
我不知道性能是否有改进,但我认为这是最理想的


我希望这对Doctrine ODM 2有帮助

在调用之前,您可以将查询类型切换到
count
getQuery

    return $this->createQueryBuilder()
        ->field('storage')->equals($storage)
        ->field('priority')->in($priorities)
        ->count()
        ->getQuery()
        ->execute();

这是一个有效的论点。使用->计数()->获取查询()->执行();这是一条路。从文件的措辞来看,这听起来没有什么区别。对于这两种情况,“返回与
find()
查询匹配的文档计数”。这意味着其中任何一个最终都将调用
find()
。这个答案是从MongoDB ODM上链接的,可能需要一些澄清。通过查询生成器发出计数将利用(请参阅:)。此外,MongoCursor::count()和MongoCollection::count()都调用相同的命令。(续)请参阅上下文实现。如果不开始迭代,则创建MongoCursor对象的开销最小(驱动程序不会与服务器通信,光标仅保存其构造函数参数和选项)-(