English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
实现原理如下
1.先查询表中的记录总数
2.随机获取偏移量为0~总记录数-1
3.查询时skip偏移量,再获取1条记录
因本人测试环境php已升级到7.0以上,mongodb扩展使用支持php7.0以上的扩展,很多方法与php5.6不同。因此代码必须在php7.0以上运行。如果是php5.6环境,需要修改代码才能运行。
代码如下:
function.php
<?php // Conectar a 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('No se puede conectar al servidor de base de datos. Error:' . $e->getMessage(), 31); } return $conn; } // Insertar datos function add($conn, $dbname, $collname, $data, $index){ // Crear índice $cmd = array( 'createIndexes' => $collname, 'indexes' => array( array( 'name' => 'index', 'key' => $index, 'ns' => $dbname.'.'.$collname ) ) ); $command = new MongoDB\Driver\Command($cmd); $conn->executeCommand($dbname, $command); // Insertar datos $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; } // Obtener el número total de registros 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; } // Obtener un registro aleatorio function randOne($conn, $dbname, $collname){ // Número total de registros $total = getCount($conn, $dbname, $collname); // Desplazamiento aleatorio $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&63; $result[0] : $result; } // Convertir objeto a array function objectToArray($obj){ $arr = is_object($obj) &63; get_object_vars($obj) : $obj; if(is_array($arr)){ return array_map(__FUNCTION__, $arr); } else { return $arr; } } ?>
demo.php
<?php require('function.php'); // Conectar a mongodb $conn = conn('localhost','testdb','root','123456); // Insertar50 registros de datos $data = array(); // Índice $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 'Éxito al insertar ' . $inserted . ' registros de prueba<br><br>'; // Obtener un registro aleatorio, extraer5次 echo 'Obtener un registro aleatorio, extraer5vez<br>'; $result = array(); for($i=0; $i<5; $i++{ $result[] = randOne($conn, 'testdb', 'user'); } echo '<pre>'; print_r($result); echo '</pre>'; ?>
Salida:
Inserción exitosa5Número de registros de prueba
Obtener un registro aleatorio, extraer5次
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 ) )
Para probar el código php, primero necesita crear testdb y crear un usuario en mongodb y ejecutar auth.
Método como follows:
use testdb db.createUser( { "user":"root", "pwd":"123456, "roles":[{"role" : "readWrite", "db":"testdb"}] } ) db.auth( { "user":"root", "pwd":"123456" } )
Resumen
Esto es todo el contenido de este artículo, espero que el contenido de este artículo pueda ayudar a sus estudios o trabajo. Si tienen alguna pregunta, pueden dejar un mensaje para intercambiar, gracias por el apoyo a Tutorial de Gritos.
Declaración: El contenido de este artículo se ha obtenido de la red, perteneciendo al autor original. El contenido se ha subido por usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha editado artificialmente y no asume la responsabilidad legal relevante. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#w.3Aviso: El contenido de este artículo se ha obtenido de la red, perteneciendo al autor original. El contenido se ha subido por usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha editado artificialmente y no asume la responsabilidad legal relevante. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio web eliminará inmediatamente el contenido sospechoso de infracción.