虚位以待(AD)
虚位以待(AD)
首页 > 数据库 > MongoDB数据库 > mongodb中随机获取1条记录的实现方法

mongodb中随机获取1条记录的实现方法
类别:MongoDB数据库   作者:码皇   来源:互联网   点击:

这篇文章运用实例给大家演示了如何在mongodb中随机获取1条记录,文中介绍的很详细,有需要的朋友们可以参考借鉴。下面来一起看看吧。

实现原理如下

    1.先查询表中的记录总数

    2.随机获取偏移量为0~总记录数-1

    3.查询时skip偏移量,再获取1条记录

因本人测试环境php已升级到7.0以上,mongodb扩展使用支持php7.0以上的扩展,很多方法与php5.6不同。因此代码必须在php7.0以上运行。如果是php5.6环境,需要修改代码才能运行。

代码如下:

function.php

    <?php// 连接mongodbfunction conn($host, $user, $passwd){
    $server = 'mongodb://'.$user.':'.$passwd.'@'.$host;
    try{
    $conn = new MongoDBDriverManager();
    }
    catch (MongoDBDriverExceptionConnectionException $e){
    throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
    }
    return $conn;
    }
    // 插入数据function add($conn, $dbname, $collname, $data, $index){
    // 创建索引 $cmd = array( 'createIndexes' => $collname, 'indexes' => array( array( 'name' => 'index', 'key' => $index, 'ns' => $dbname.'.'.$collname ) ) );
    $command = new MongoDBDriverCommand($cmd);
    $conn->executeCommand($dbname, $command);
    // 插入数据 $bulk = new MongoDBDriverBulkWrite();
    $inserted = 0;
    if($data){
    foreach($data as $k=>$v){
    $bulk->insert($v);
    }
    $result = $conn->executeBulkWrite($dbname.'.'.$collname, $bulk);
    $inserted = $result->getInsertedCount();
    }
    return $inserted;
    }
    // 获取总记录数function getCount($conn, $dbname, $collname){
    $cmd = array( 'count' => $collname, 'query' => array() );
    $command = new MongoDBDriverCommand($cmd);
    $result = $conn->executeCommand($dbname, $command);
    $response = current($result->toArray());
    if($response->ok==1){
    return $response->n;
    }
    return 0;
    }
    // 随机获取一条记录function randOne($conn, $dbname, $collname){
    // 总记录数 $total = getCount($conn, $dbname, $collname);
    // 随机偏移 $skip = mt_rand(0, $total-1);
    $filter = array();
    $options = array('skip'=>$skip, 'limit'=>1);
    $query = new MongoDBDriverQuery($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;
    }
    // 对象转为数组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

    <?phprequire('function.php');
    // 连接mongodb$conn = conn('localhost','testdb','root','123456');
    // 插入50条数据记录$data = array();
    // 索引$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 '成功插入'.$inserted.'条测试记录数<br><br>';
    // 随机获取一条记录,抽5次echo '随机获取一条记录,抽5次<br>';
    $result = array();
    for($i=0;
    $i<5;
    $i++){
    $result[] = randOne($conn, 'testdb', 'user');
    }
    echo '<pre>';
    print_r($result);
    echo '</pre>';
    ?>

输出:

成功插入50条测试记录数

随机获取一条记录,抽5次

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

测试php代码,首先需要在mongodb创建testdb及创建用户和执行auth

方法如下:

    use testdbdb.createUser( {
    "user":"root", "pwd":"123456", "roles":[{
    "role" : "readWrite", "db":"testdb"}
    ] }
    ) db.auth( {
    "user":"root", "pwd":"123456" }
    )

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关热词搜索: mongo 随机获取记录 mongodb 随机抽取 mon