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

Méthode de récupération aléatoire dans mongodb1Méthode d'implémentation de l'enregistrement

实现原理如下

    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.)

Vous pourriez aussi aimer