如何随机选择Doctrine ODM?

时间:2016-12-27 21:06:23

标签: php mongodb doctrine-orm symfony

我想从 MongoDB 集合中选择一个随机文档。如果我使用MySQL,我的解决方案将类似于this

如何使用 Doctrine ODM 查询构建器从MongoDB Collection中选择随机文档?

4 个答案:

答案 0 :(得分:2)

<?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();

答案 1 :(得分:1)

我用这种方式解决了我的问题:

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();
}

答案 2 :(得分:1)

试试这个解决方案:

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();
}

答案 3 :(得分:1)

由于您的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