各位用户为了找寻关于mongodb 随机获取一条记录的方法的资料费劲了很多周折。这里教程网为您整理了关于mongodb 随机获取一条记录的方法的相关资料,仅供查阅,以下为您介绍关于mongodb 随机获取一条记录的方法的详细内容
原理:
1.先查询表中的记录总数
2.随机获取偏移量为0~总记录数-1
3.查询时skip偏移量,再获取1条记录
因本人测试环境PHP已升级到7.0以上,mongodb扩展使用支持php7.0以上的扩展,很多方法与php5.6不同。因此代码必须在php7.0以上运行。如果是php5.6环境,需要修改代码才能运行。
代码如下:
function.php
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95<?php
// 连接mongodb
function
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
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32<?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>'
;
?>
输出:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31成功插入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 testdb
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14db.createUser(
{
"user"
:
"root"
,
"pwd"
:
"123456"
,
"roles"
:[{
"role"
:
"readWrite"
,
"db"
:
"testdb"
}]
}
)
db.auth(
{
"user"
:
"root"
,
"pwd"
:
"123456"
}
)
源码下载地址:点击查看
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!