mongodb to randomly acquire 1 record
- 2020-06-12 10:53:14
- OfStack
Here's how it works
1. First query the total number of records in the table
2. The random offset is 0~ the total number of records -1
3. skip offset during query, and then get 1 record
Since my test environment php has been upgraded to 7.0 or above and the mongodb extension USES extensions that support php7.0 or above, many methods are different from php5.6. Therefore, the code must run above php7.0. If it is an php5.6 environment, you need to modify the code to run.
The code is as follows:
function.php
<?php
// The connection 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;
}
// Insert data
function add($conn, $dbname, $collname, $data, $index){
// Create indexes
$cmd = array(
'createIndexes' => $collname,
'indexes' => array(
array(
'name' => 'index',
'key' => $index,
'ns' => $dbname.'.'.$collname
)
)
);
$command = new MongoDB\Driver\Command($cmd);
$conn->executeCommand($dbname, $command);
// Insert data
$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;
}
// Gets the total number of records
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;
}
// Random access 1 records
function randOne($conn, $dbname, $collname){
// The total number of records
$total = getCount($conn, $dbname, $collname);
// Random drift
$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;
}
// Object to array
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');
// The connection mongodb
$conn = conn('localhost','testdb','root','123456');
// insert 50 Bar data record
$data = array();
// The 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 ' Successful insertion '.$inserted.' Number of test records <br><br>';
// Random access 1 records , smoke 5 time
echo ' Random access 1 Record, draw 5 time <br>';
$result = array();
for($i=0; $i<5; $i++){
$result[] = randOne($conn, 'testdb', 'user');
}
echo '<pre>';
print_r($result);
echo '</pre>';
?>
Output:
50 test records were inserted successfully
Randomly get 1 record and draw 5 times
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
)
)
To test the php code, you first need to create it in mongodb
testdb
And create users and execute
auth
.
The methods are as follows:
use testdb
db.createUser(
{
"user":"root",
"pwd":"123456",
"roles":[{"role" : "readWrite", "db":"testdb"}]
}
)
db.auth(
{
"user":"root",
"pwd":"123456"
}
)
conclusion