mongodb 随机获取一条记录的方法

2023-05-16

原理:

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

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

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


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

代码如下:

function.php

<?php
// 连接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;
}

// 插入数据
function add($conn, $dbname, $collname, $data, $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);

    // 插入数据
    $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;
}

// 获取总记录数
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;
}

// 随机获取一条记录
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 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;
}

// 对象转为数组
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');

// 连接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条测试记录数

随机获取一条记录,抽5Array
(
    [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 testdb

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

db.auth(  
    {  
        "user":"root",  
        "pwd":"123456"  
    }  
) 



源码下载地址:点击查看

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongodb 随机获取一条记录的方法 的相关文章

随机推荐

  • C++产生随机数

    随机数 计算机的随机数都是由伪随机数 xff0c 即是由小M多项式序列生成的 xff0c 其中产生每个小序列都有一个初始值 xff0c 即随机种子 xff08 注意 xff1a 小M多项式序列的周期是65535 xff0c 即每次利用一个随
  • git 误删分支恢复方法

    在使用git的过程中 xff0c 因为人为因素造成分支 xff08 commit 被删除 xff0c 可以使用以下步骤进行恢复 首先用以下步骤创建一个新分支 xff0c 修改一些文件后删除 xff0c 以便进行恢复 1 创建分支 abc g
  • 软件工程师的鄙视链

    最近这几年在世界各地突然吹起了一股全民写程序的风潮 xff0c 但是身为一介靠写程序 xff08 以及在上班时间胡乱上网 xff09 来谋生的 developer xff08 所谓的 developer 就是 软件工程师 的比较潮的说法 x
  • mac使用brew安装软件失败的通用解决方法

    使用mac的brew安装软件 xff0c 有时会出现安装失败 xff0c 或显示安装成功 xff0c 但不能正常使用的情况 例如安装php56 redis扩展 xff0c 显示安装成功 xff0c 重启后查看phpinfo看不到redis扩
  • node.JS md5加密中文与php结果不一致的解决方法

    因项目需要 xff0c 需要node JS与php做接口调用 xff0c 发现node JS对中文使用md5加密与php对中文md5加密的结果不同 PHP span class php span class hljs preprocesso
  • mysql互换表中两列数据方法

    1 创建表及记录用于测试 span class hljs operator span class hljs keyword CREATE span span class hljs keyword TABLE span span class
  • mysql 时间戳格式化函数from_unixtime使用说明

    我们一般使用字段类型int 11 时间戳来保存时间 xff0c 这样方便查询时提高效率 但这样有个缺点 xff0c 显示的时间戳 xff0c 很难知道真实日期时间 mysql提供了一个时间戳格式化函数from unixtime来转换格式 f
  • mysql函数concat与group_concat使用说明

    1 concat 函数 使用方法 xff1a concat str1 str2 返回的结果为连接参数产生的字符串 xff0c 如有任何一个参数为null xff0c 则返回值为null 注意 xff1a 如果所有参数均为非二进制字符串 xf
  • mysql innodb启动失败无法重启的处理方法

    电脑在使用过程中死机 xff0c 重启后发现mysql没有启动成功 xff0c 查看错误日志发现是innodb出现问题导致mysql启动失败 错误日志 mysql server start Starting MySQL ERROR The
  • mac环境使用sed修改文件出错的解决方法

    sed是linux命令 xff0c 用于处理文件内容 xff08 修改 xff0c 替换等 xff09 xff0c mac中都可以使用 xff0c 但发现相同的替换命令在linux可以正常执行 xff0c 在mac则执行失败 出错原因 用s
  • mysql order by rand() 效率优化方法

    从一次查询中随机返回一条数据 xff0c 一般使用mysql的order by rand 方法来实现 例如 从20万用户中随机抽取1个用户 span class hljs header mysql gt select from user o
  • 汇编语言:使用冒泡排序算法将10个数按从小到大顺序排列

    汇编语言 xff1a 冒泡排序算法 题目描述 自定义一组有首地址为data的10个字的数组 xff0c 请利用冒泡排序算法来编写程序 xff0c 使该数组中的数按照从小到大的次序有序化 xff08 注 xff1a 10个字可以自己定义 xf
  • 今天终于弄懂结构体数组与结构体变量的关系

    本人也是学计算机专业的 xff0c 但我是一个技术小白 xff0c 今年大一刚刚入学 xff0c 现在在过寒假 xff0c 因为我的C语言成绩并不太好 xff0c 父母总是为我感到担忧 xff0c 因此 xff0c 我每天都在敲代码 xff
  • MongoDB 导出导入备份恢复数据实例

    创建测试数据 创建db testdb collection user 插入10条记录 mongo MongoDB shell span class hljs property version span span class hljs num
  • crontab 使用日期时间命名重定向文件

    linux crontab命令可以实现定时执行任务 xff0c 最小的执行周期是1分钟 关于crontab的使用可以查看 Linux crontab定时执行任务 命令格式与详细例子 例 xff1a 每天12点执行test php xff0c
  • php 使用redis锁限制并发访问类

    1 并发访问限制问题 对于一些需要限制同一个用户并发访问的场景 xff0c 如果用户并发请求多次 xff0c 而服务器处理没有加锁限制 xff0c 用户则可以多次请求成功 例如换领优惠券 xff0c 如果用户同一时间并发提交换领码 xff0
  • mysql导入大批量数据出现MySQL server has gone away的解决方法

    因工作需要 xff0c 需要导入一个200M左右的sql到user库 执行命令 mysql gt use user Database changed mysql gt span class hljs built in source span
  • mysql 搜寻附近N公里内数据的实例

    根据圆周率和地球半径系数以及搜寻点的经纬度 xff0c 搜寻数据表中与搜寻点之间的距离为N公里内的数据 1 创建测试表 span class hljs operator span class hljs keyword CREATE span
  • crontab 精确到执行分钟内某一秒执行的方法

    linux crontab命令可以实现定时执行任务 xff0c 最小的执行周期是1分钟 关于crontab的使用可以查看 Linux crontab定时执行任务 命令格式与详细例子 执行指定命令默认是当前执行分钟的第0 1秒开始 例如 xf
  • mongodb 随机获取一条记录的方法

    原理 xff1a 1 先查询表中的记录总数 2 随机获取偏移量为0 总记录数 1 3 查询时skip偏移量 xff0c 再获取1条记录 因本人测试环境php已升级到7 0以上 xff0c mongodb扩展使用支持php7 0以上的扩展 x