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 // Connection à mongodb function conn($host, $user, $passwd){ $server = 'mongodb:'//try{ $conn = new MongoDB\Driver\Manager(); catch (MongoDB\Driver\Exception\ConnectionException $e){ } throw new ErrorException('Impossible de se connecter au serveur de base de données. Erreur:' . $e->getMessage(), 31); } return $conn; } // Insérer des données function add($conn, $dbname, $collname, $data, $index){ // Créer un 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); // Insérer des données $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; } // Obtenir le nombre total d'enregistrements 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; } // Obtenir un enregistrement au hasard function randOne($conn, $dbname, $collname){ // Nombre total d'enregistrements $total = getCount($conn, $dbname, $collname); // Décalage aléatoire $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 un objet en tableau 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'); // Connection à mongodb $conn = conn('localhost','testdb','root','123456); // Insertion50 enregistrements de données $data = array(); // Index $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 'Succès de l'insertion de $inserted enregistrements de test<br><br>'; // obtenir aléatoirement une enregistrement, tirer5fois echo 'obtenir aléatoirement une enregistrement, tirer5fois<br>'; $result = array(); for($i=0; $i<5; $i++{ $result[] = randOne($conn, 'testdb', 'user'); } echo '<pre>'; print_r($result); echo '</pre>'; ?>
Sortie :
insertion réussie5nombre de tests enregistrés
obtenir aléatoirement une enregistrement, tirer5fois
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 ) )
Pour tester le code PHP, vous devez d'abord créer testdb dans MongoDB, créer un utilisateur et exécuter auth.
La méthode est la suivante :
use testdb db.createUser( { "user":"root", "pwd":"123456, "roles":[{"role" : "readWrite", "db":"testdb"}] } ) db.auth( { "user":"root", "pwd":"123456" } )
Résumé
Voici le contenu complet de cet article. J'espère que le contenu de cet article pourra vous aider dans vos études ou votre travail. Si vous avez des questions, vous pouvez laisser des commentaires pour échanger. Merci de votre soutien au tutoriel d'alarme.
Déclaration : le contenu de cet article est hébergé sur Internet, propriété des auteurs respectifs, le contenu est apporté par les utilisateurs d'Internet de manière spontanée et téléversé, ce site ne détient pas de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, vous êtes invités à envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois confirmée, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)