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

Método de obtención aleatoria en mongodb1Método de implementación de registros

实现原理如下

    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.

Te gustará