English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

طريقة الحصول على سجل عشوائي في mongodb

The implementation principle is as follows

    1. First query the total number of records in the table

    2. Randomly get the offset of 0 to total number of records - 1

    3. When querying, skip the offset, and then get 1 record

Because my test environment php has been upgraded to 7.0 and above, the mongodb extension uses an extension that supports php7.0 and above, many methods are different from php5.6. Therefore, the code must be run on php7.0 and above. If it is a php5.6 environment, the code needs to be modified to run.

代码如下:

function.php

<?php
// 连接mongodb
function conn($host, $user, $passwd){
 $server = 'mongodb://'.$user.':'.$passwd.'@'.$host;
 try{
  $conn = new MongoDB\Driver\Manager();
 } catch (MongoDB\Driver\Exception\ConnectionException $e){
  throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
 }
 return $conn;
}
// إدراج البيانات
function add($conn, $dbname, $collname, $data, $index){
 // إنشاء مؤشر
 $cmd = array(
  'createIndexes' => $collname,
  'indexes' => array(
   array(
    'name' => 'index',
    'key' => $index,
    'ns' => $dbname.'.'.$collname
   )
  )
 );
 $command = new MongoDB\Driver\Command($cmd);
 $conn->executeCommand($dbname, $command);
 // إدراج البيانات
 $bulk = new MongoDB\Driver\BulkWrite();
 $inserted = 0;
 if($data){
  foreach($data as $k=>$v){
   $bulk->insert($v);
  }
  $result = $conn->executeBulkWrite($dbname.'.'.$collname, $bulk);
  $inserted = $result->getInsertedCount();
 }
 return $inserted;
}
// الحصول على عدد السجلات الإجمالي
function getCount($conn, $dbname, $collname){
 $cmd = array(
  'count' => $collname,
  'query' => array(),
 );
 $command = new MongoDB\Driver\Command($cmd);
 $result = $conn->executeCommand($dbname, $command);
 $response = current($result->toArray());
 if($response->ok==1){
  return $response->n;
 }
 return 0;
}
// الحصول على سجل عشوائي
function randOne($conn, $dbname, $collname){
 // عدد السجلات الإجمالي
 $total = getCount($conn, $dbname, $collname);
 // جعل التحرير عشوائي
 $skip = mt_rand(0, $total-1);
 $filter = array();
 $options = array('skip'=>$skip, 'limit'=>1);
 $query = new MongoDB\Driver\Query($filter, $options);
 $cursor = $conn->executeQuery($dbname.'.'.$collname, $query);
 $result = array();
 if($cursor){
  foreach($cursor as $v){
   $v = objectToArray($v);
   unset($v['_id']);
   $result[] = $v;
  }
 }
 return $result? $result[0] : $result;
}
// 对象转为数组
function objectToArray($obj){
 $arr = is_object($obj) ? get_object_vars($obj) : $obj;
 if(is_array($arr)){
  return array_map(__FUNCTION__, $arr);
 }else{
  return $arr;
 }
}
?>

demo.php

<?php
require('function.php');
// 连接mongodb
$conn = conn('localhost','testdb','root','123456');
// 插入50条数据记录
$data = array();
// 索引
$index = array('user'=>true);
for($i=0; $i<50; $i++){
 $data[] = array(
  'user' => 'test_user_'.str_pad($i, 4, '0', STR_PAD_LEFT)
 );
}
$inserted = add($conn, 'testdb', 'user', $data, $index);
echo '成功插入'.$inserted.'条测试记录数<br><br>';
// 随机获取一条记录,抽5次
echo '随机获取一条记录,抽5次<br>';
$result = array();
for($i=0; $i<5; $i++){
 $result[] = randOne($conn, 'testdb', 'user');
}
echo '<pre>';
print_r($result);
echo '</pre>';
?>

الإخراج:

تم إدخال 50 سجلًا تجريبيًا بنجاح

استخراج سجل عشوائي، 5 مرات

Array
(
 [0] => Array
  (
   [user] => test_user_0017
  )
 [1] => Array
  (
   [user] => test_user_0026
  )
 [2] => Array
  (
   [user] => test_user_0004
  )
 [3] => Array
  (
   [user] => test_user_0043
  )
 [4] => Array
  (
   [user] => test_user_0023
  )
)

للبدء في اختبار الكود PHP، يجب أولاً إنشاء قاعدة البيانات testdb وإنشاء المستخدم وإجراء عملية auth في mongodb.

كيفية القيام بذلك:

use testdb
db.createUser( 
 { 
  "user":"root", 
  "pwd":"123456", 
  "roles":[{"role" : "readWrite", "db":"testdb"}] 
 } 
) 
db.auth( 
 { 
  "user":"root", 
  "pwd":"123456" 
 } 
) 

النهاية

هذا هو محتوى المقال الكامل، نأمل أن يساعد محتوى هذا المقال في تعلمكم أو عملكم، إذا كان لديكم أي أسئلة، يمكنكم ترك تعليقات للتفاعل، شكرًا لدعمكم لتعليم呐喊.

بيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المحتوى لصاحب الحقوق، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل متعاوني وتحميله بشكل مستقل، لا يمتلك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فمرحبًا بك في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، يرجى تقديم الدليل ذات الصلة، إذا تم التحقق من ذلك، سيقوم هذا الموقع بإزالة المحتوى المزعوم بسرعة.

أنت قد تحب