【问题标题】:How to select randomly with Doctrine ODM?如何使用 Doctrine ODM 随机选择?
【发布时间】:2018-08-10 11:50:15
【问题描述】:

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

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

【问题讨论】:

    标签: php mongodb doctrine-orm symfony


    【解决方案1】:
    <?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();
    

    【讨论】:

      【解决方案2】:

      我已经通过这种方式解决了我的问题:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          试试这个解决方案:

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

          【讨论】:

            猜你喜欢
            • 2014-05-23
            • 2017-06-22
            • 1970-01-01
            • 1970-01-01
            • 2019-10-29
            • 2020-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多