English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

mongodb에서 무작위로 가져오기1데이터의 구현 방법

실제 원리는 다음과 같습니다

    1. 테이블의 레코드 수를 먼저 쿼리합니다

    2. 랜덤으로 0에서 총 레코드 수 사이의 오프셋을 가져옵니다-1

    3.skip 오프셋을 사용하여 쿼리한 후1개의 레코드

본인의 테스트 환경에서 PHP는 이미7.0 이상에서 실행되어야 합니다. 많은 방법이 PHP7.0 이상에서 실행되어야 합니다. 많은 방법이 PHP5.6.0 이상의 확장에서 실행되어야 합니다. 많은 방법이 PHP7.0 이상에서 실행됩니다. PHP라면 다르기 때문에 코드는 PHP5.6환경에서는 코드를 수정해야 실행됩니다。

코드는 다음과 같습니다:

function.php

<?php
// mongodb에 연결
function conn($host, $user, $passwd){
 $server = 'mongodb:'//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개의 테스트 기록 수

임의의 기록을 가져오기 위해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
db.createUser( 
 { 
  "user":"root", 
  "pwd":"123456", 
  "roles":[{"role" : "readWrite", "db":"testdb"}] 
 } 
) 
db.auth( 
 { 
  "user":"root", 
  "pwd":"123456" 
 } 
) 

결론

이 문서의 모든 내용이 끝납니다. 이 문서의 내용이 여러분의 학습이나 업무에 도움이 되길 바랍니다. 의문이 있으면 댓글을 통해 교류해 주세요. 감사합니다. 나대본 교본에 대한 지지에 감사합니다.

고지사항: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 본사이트에 소유되어 있지 않으며, 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 것이며, 본 사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 있는 내용을 발견하면 notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(보고할 때는 #을 @으로 변경하십시오. 관련 증거를 제공하고, 확인되면 해당 사이트가 즉시 위반 내용을 삭제합니다。)

좋아하는 것