最近项目用到mongodb 的模糊查询,google搜到的方法,记录下Mongodb php 模糊查询 function query(){          $m  = new mongo('127.0.0.1',27017);         $db = $m->selectDB('dbname');          $coll= $db->selectCollection('collname');          $q   = new MongoRegex("/word/");         //调用mongodb 正则   $cursor = $coll->find( array('field' => $q ));         print $cursor->count();  }  
Tags:

启动mongodb时,提示Unclean  shutdown detected mongodb,解决方法很简单

mongod  --repair --dbpath /var/db/mongodb

Tags:

<?php
//初始化gridfs
$conn = new Mongo(); //连接MongoDB
$db = $conn->photos; //选择数据库
$grid = $db->getGridFS(); //取得gridfs对象

//gridfs有三种方式存储文件
//第一种直接存储文件
$id = $grid->storeFile("./logo.png");

//第二种存储文件二进制流
$data = get_file_contents("./logo.png");
$id = $grid->storeBytes($data,array("parame"=>’附加参数将随图片一起存入’));

//第三种保存直接表单提交的文件$_FILES
$id = $grid->storeUpload('upfile');
//相当于
$id = $grid->storeFile($_FILES[‘upfile’][‘tmp_name’]);

//--------------以上是保存图片--下面开始读取图片----------------

//保存成功后返回$id = md5字符串
$logo = $grid->findOne(array('_id'=>$id)); //以_id为索引取得文件
header('Content-type: image/png'); //输出图片头
echo $logo ->getBytes(); //输出数据流
?>


GridFS是MongoDB的二进制数据存储在数据库中的解决方案,用来处理大文件。GridFS不是MongoDB自身特性,MongoDB没有实现它的代码。GridFS只是制定大文件在数据库中如何处理,是通过开发语言驱动来完成和通过API接口来存储检索大文件。

按照设计,MongoDB文档(BSON对象)不能超过16M,这是为了使性能保持在最高水平。如果文档超过16M,当查询时将占用大量的内存。

GridFS指定了将一个大文件分割成多个文档的机制。通过开发语言扩展来实现,例如php扩展,在存储时,分块存储,在检索时,合并分块。

开发人员无需知道内部细节,存储和处理文件是一个透明高效的方式。

GridFS存储在两个独立的集合中:文件和块。基本的想法是为每一个文件被存储在GridFS。文件将有一个文档包含文件名,大小,上传时间以及其他用户定义的元数据。文件的内容存储在一个或多个文档块中。  PHP是以256Kbyte大小来分块。

使用php来实现  


# vi upload.html

<html>
<head>
<meta http-equiv=”Content-Type content=”text/html; charset=utf-8″/>
<title>Upload Files</title>
</head>
<body>
<h2>Select files to upload</h2>
<form enctype=”multipart/form-data action=”/store.php method=”post”>
 <input type=”file name=”file”><br>
 <input type=”submit name=”submit value=”Upload”>
</form>
</body>
</html>


<?php
$host="127.0.0.1";
$port="27017";
$dbname="ttlsa";
$coname="ttlsa_com";
if($_FILES['file']['error'] !== 0){
 die('Error upload file. Error code '.$_FILES['file']['error']);
}
$filename=$_FILES['file']['name'];
$filetype=$_FILES['file']['type'];
$tmpfilepath=$_FILES['file']['tmp_name'];
$conn = new Mongo("mongodb://".$host.":".$port,array('timeout'=>100));
$database = $conn->selectDB($dbname);
$collection = $database->selectCollection($coname);
$gridfs=$database->getGridFS();
$id=$gridfs->storeFile($tmpfilepath,array('filename'=>$filename,'filetype'=>$filetype));
echo "File Uploaded. ID: ".$id."\n";
?>


<?php
$host="127.0.0.1";
$port="27017";
$dbname="ttlsa";
$id=$_GET['id'];
$conn = new Mongo("mongodb://".$host.":".$port,array('timeout'=>100));
$database = $conn->selectDB($dbname);
$gridfs=$database->getGridFS();
$object=$gridfs->findOne(array('_id'=>new MongoId($id)));
header('Content-type: '.$object->file['filetype']);
echo $object->getBytes();
?>

使用getBytes会有一个潜在的问题,将文件内容全部加载到内存中。如果读取大文件这种方式性能差。GridFS是将文件分块存储的,那么可以单独的从每个块读取和输出,从而避免上述问题。  
Tags:
先生成测试数据:

<?php
   ini_set('mongo.native_long', 1);
   $instance = new Mongo();
   $instance = $instance->selectCollection('test', 'test');
   for ($i = 0; $i < 10; $i++) {
   $instance->insert(array(
   'group_id' => rand(1, 5),
   'count'    => rand(1, 5),
   ));
   }
?>

下面让我们使用group操作,根据group_id分组,汇总计算count,用MapReduce实现:

MapReduc用法:

db.runCommand(

 { mapreduce : <collection>,
  map : <mapfunction>,
  reduce : <reducefunction>,
  out : <see output options below>
  [, query : <query filter object>]
  [, sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>]
  [, limit : <number of objects to return from collection, not supported with sharding>]
  [, keeptemp: <true|false>]
  [, finalize : <finalizefunction>]
  [, scope : <object where fields go into javascript global scope >]
  [, jsMode : true]
  [, verbose : true]
}
);

参数说明:
mapreduc:要操作的目标集合。
map:映射函数(生成键值对序列,作为 reduce 函数参数)。
reduce:统计函数。
query :目标记录过滤。
sort:目标记录排序。
limit:限制目标记录数量。
out:统计结果存放集合(不指定则使用临时集合,在客户端断开后自动删除)。
keeptemp:是否保留临时集合。
finalize:最终处理函数(对 reduce 返回结果进行最终整理后存入结果集合)。
score:向 map、reduce、finalize 导入外部变量。
verbose : 显示详细的时间统计信息。

<?php
   ini_set('mongo.native_long', 1);
   $instance = new Mongo();
   $instance = $instance->selectDB('test');
   $map = '
   function() {
   emit(this.group_id, this.count);
   }
   ';
   $reduce = '
   function(key, values) {
   var sum = 0;
   for (var index in values) {
   sum += values[index];
   }
   return sum;
   }
   ';
   $result = $instance->command(array(
   'mapreduce' => 'test',
   'map'       => $map,
   'reduce'    => $reduce

  'out' => 'test_res'

   ));

 

 

   $resData = new Mongo();
   $resData = $instance->selectDB('test_res');

 $result = $resData->find();
  //$result = iterator_to_array($instance->{$result['result']}->find());
   var_dump($result);
   ?>
Tags:
分页: 2/2 第一页 上页 1 2 最后页 [ 显示模式: 摘要 | 列表 ]