【发布时间】:2018-08-10 11:50:15
【问题描述】:
我想从 MongoDB 集合中随机选择一个文档。如果我使用 MySQL,我的解决方案将类似于 this。
如何使用 Doctrine ODM 查询构建器从 MongoDB 集合中选择随机文档?
【问题讨论】:
标签: php mongodb doctrine-orm symfony
我想从 MongoDB 集合中随机选择一个文档。如果我使用 MySQL,我的解决方案将类似于 this。
如何使用 Doctrine ODM 查询构建器从 MongoDB 集合中选择随机文档?
【问题讨论】:
标签: php mongodb doctrine-orm symfony
<?php
// Create Query Builder.
$dm = $this->getDocumentManager()->createQueryBuilder('Document');
// Count documents.
$count = $dm->getQuery()->execute()->count();
// Get random number not exceeding $count variable.
$random = mt_rand(0, $count);
// Query for document with skip.
$random_document = $dm->skip($random)
->getQuery()
->getSingleResult();
【讨论】:
我已经通过这种方式解决了我的问题:
public function getRandomUser()
{
$qb = $this->getDocumentManager()->createQueryBuilder('AppBundle:User');
$count = $qb->getQuery()->count();
$skip_count = random_int(0, $count);
$qb->skip($skip_count);
return $qb->getQuery()->getSingleResult();
}
【讨论】:
由于你的 Mongo 服务器是 3.2 或更高版本,你可以使用 $sample 聚合命令:
$ab = $this->dm->createAggregationBuilder(User::class);
$ab->sample($count);
return $ab->hydrate(User::class)->execute();
请记住,结果集可以包含不唯一的元素,关于 $sample https://docs.mongodb.com/manual/reference/operator/aggregation/sample/#behavior的附加阅读
对于旧的 Mongo 服务器,您应该在持久化时为每个文档设置随机值,并使用 $lt-$gt 查询来获取随机集,请参考Random record from MongoDB
【讨论】:
试试这个解决方案:
public function getRandomDocument()
{
$qb = $this->getDocumentManager()->createQueryBuilder('YourBundle:TargetDocument');
$count = $qb->getQuery()->count();
$skip_count = random_int(0, $count);
$qb->skip($skip_count);
return $qb->getQuery()->getSingleResult();
}
【讨论】: