จะเลือกแบบสุ่มด้วย Doctrine ODM ได้อย่างไร

ฉันต้องการเลือกเอกสารแบบสุ่มหนึ่งฉบับจากคอลเล็กชัน MongoDB หากฉันใช้ MySQL โซลูชันของฉันจะคล้ายกับสิ่งนี้.

ฉันจะเลือกเอกสารสุ่มจาก MongoDB Collection โดยใช้ตัวสร้างคิวรี Doctrine ODM ได้อย่างไร


person Łukasz D. Tulikowski    schedule 27.12.2016    source แหล่งที่มา


คำตอบ (3)


ฉันแก้ไขปัญหาด้วยวิธีนี้:

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();
}
person Łukasz D. Tulikowski    schedule 27.12.2016

เนื่องจากเซิร์ฟเวอร์ Mongo ของคุณเป็นเวอร์ชัน 3.2 หรือใหม่กว่า คุณสามารถใช้คำสั่ง $sample aggregation ได้:

$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 เพื่อดึงชุดสุ่ม โปรดดูที่ บันทึกแบบสุ่มจาก MongoDB

person George Novik    schedule 10.08.2018

ลองใช้วิธีแก้ปัญหานี้:

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();
}
person Community    schedule 27.12.2016