好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mongodb中随机获取1条记录的实现方法

实现原理如下

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

?

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>' ;

?>

输出:

成功插入50条测试记录数

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

?

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

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 。

方法如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

use testdb

 

db.createUser(

  {

   "user" : "root" ,

   "pwd" : "123456" ,

   "roles" :[{ "role" : "readWrite" , "db" : "testdb" }]

  }

)

 

db.auth(

  {

   "user" : "root" ,

   "pwd" : "123456"

  }

)

总结

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

查看更多关于mongodb中随机获取1条记录的实现方法的详细内容...

  阅读:40次