首頁 > php教程 > php手册 > PHP操作mongodb

PHP操作mongodb

WBOY
發布: 2016-06-06 19:42:26
原創
1326 人瀏覽過

基础教程: 1.连接mongo数据库服务器。 语法范例: ?php$connection = new MongoClient(); // 连接到本地数据库,默认端口为27017.即:localhost:27017$connection = new MongoClient( mongodb://example.com ); // 连接远程数据库,默认端口为27017$connect

基础教程:

1.连接mongo数据库服务器。

语法范例:

<?php $connection = new MongoClient(); // 连接到本地数据库,默认端口为27017.即:localhost:27017
$connection = new MongoClient( "mongodb://example.com" ); // 连接远程数据库,默认端口为27017
$connection = new MongoClient( "mongodb://example.com:65432" ); // 连接远程数据库,端口号为指定的端口号。
?>
登入後複製

2.连接一个数据库

语法范例:

<?php $connection = new MongoClient();//连接到本地数据库,默认端口:27017
登入後複製
$db = $connection->dbname;//选择数据库名为dbname的数据库
?>
登入後複製
数据库名不用事先创建,当你选择它时,mongodb可以创建一个新的名为dbname数据库。

注意:不要写错数据库名,否则你回不经意间生成一个数据库,这会导致数据库混乱。

以下程序会因拼写错误生成两个数据库:

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$db = $connection->mybiloglongdbname;//连接一个数据库
登入後複製
$db = $connection->mybiloglongdbanme;//连接一个不一样名字的数据库
登入後複製
 ?>
登入後複製

3.连接一个数据库集合

获取一个集合和连接一个数据库语法是相同的。

语法范例:

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$db = $connection->baz;
$collection = $db->foobar;//选择一个集合
登入後複製
//也可以直接选择一个数据库和一个集合
登入後複製
$collection = $connection->baz->foobar;
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
集合和关系型数据库中的表类似。

4.插入一个文档

关联数组是最基本的结构,它保存到集合中。

一些随机的"文档"可以是:

<?php  
登入後複製
登入後複製
$doc = array(
登入後複製
"name"=>"MongoDB",
登入後複製
"type"=>"database",
登入後複製
"count"=>1;
登入後複製
"info"=>(object)array("x"=>203, "y"=>102),
登入後複製
"versions"=>array("0.9.7", "0.9.8", "0.9.9")
登入後複製
);
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
注意:你可以有嵌套的数组和对象。驱动程序通常将一个关联数组作为一个数据库中的对像来保存。

一个数字索引数组通常按以下情况作为一个数组来存储:关键字从0开始,不间断。或者作为一个对象

:数组的关键字不是从0开始,中间会有间断。

插入这个文档,可以用这个函数 MongoCollection::insert():

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection->insert($doc);
?>
登入後複製

5,查找一个集合使用 MongoCollection::findOne()

为了能搜索出集合数据,我们事先已经在数据库中存储了相应的数据。我们只需要一个简单的方法 

MongoCollection::findOne() 便可以从集合中取到唯一的文档。这个方法适用于:只有唯一的一条数据匹配

查询数据。

实例:

<?php  
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$document = $collection->findOne();
登入後複製
var_dump($document);
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
以上实例输出:
array(6) {
["_id"]=>
object(MongoId)#8 (1) {
["$id"]=>
string(24) "4e2995576803fab768000000"
}
["name"]=>
string(7) "MongoDB"
["type"]=>
string(8) "database"
["count"]=>
int(1)
["info"]=>
array(2) {
["x"]=>
    int(203)
    ["y"]=>
    int(102)
  }
  ["versions"]=>
  array(3) {
    [0]=>
    string(5) "0.9.7"
    [1]=>
    string(5) "0.9.8"
    [2]=>
    string(5) "0.9.9"
  }
}
登入後複製
我们注意到这里有一个“_id”的字段已经被自动加到文档中,_id 是主键字段。

如果文档没有定义主键字段,驱动程序会自动添加一个。

若你定义一个你自己的_id字段,它必须对于整个集合是独一无二的。

例子:

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$db = $connection->datebase;
登入後複製
$db->foo->insert(array("_id"=>1));
登入後複製
登入後複製
//下面这个将抛出一个异常
登入後複製
$db->foo->insert(array("_id"=>1));
登入後複製
登入後複製
//下面这个是正确的,因为这个是在另外一个集合中
登入後複製
$db->bar->insert(array("_id"=>1));
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
你也可以通过传递数组("w"=>0)作为第二个元素,选择关闭该行为。

也就是说驱动程序不必等待数据库去确认写,也不必抛出复制_id的异常。

6.添加多个文档

为了让我们做更多有意思的事情,我们来添加许多简单的文档给集合。

这些文档仅仅是这种形式的数据array("i"=>value),我们可以在一个循环中相当有效率的添加上。

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
for($i=0;$i<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">{
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection->insert(array('i'=>$i, "field{$i}"=>$i*2));
登入後複製
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
注意:我们可以插入关键字不同的文档在同一个集合中,这也就是为什么我们称MongoDB是模式自由。

7.统计一个集合中文档数目

当我们在集合中插入101个文档时,我们可以用方法MongoCollection::count()来统计文档数:

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
echo $collection->count();
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
输出结果为:101

8.运用Cursor得到所有的文档

为了得到集合中所有的文档,我们将用MongoCollection::find()。

find()方法可以返回一个MongoCursor对象,这个对象允许我们可以迭代出符合我们查询条件的文档。

然后 查询所有文档,并打印出来。

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$cursor = $collection->find();
登入後複製
foreach($cursor as $id=>$value)
登入後複製
{
登入後複製
登入後複製
登入後複製
登入後複製
echo "$id:";
登入後複製
var_dump($value);
登入後複製
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
可以打印出集合中所有的文档。

$id i是 文档的_id字段,$value是文档本身。

9.设置查询标准

我们可以用一条查询语句通过方法 MongoCollection::find()来获得集合中文档的一个子集。

例如:如果你想找到  "i"字段的值为71的文档,我们可以按下面的做法去做:

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$query = array('i'=71);
登入後複製
$cursor = $collection->find($query);
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
while($cursor->hasNext)
登入後複製
登入後複製
{
登入後複製
登入後複製
登入後複製
登入後複製
var_dump($cursor->getNext());
登入後複製
登入後複製
登入後複製
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
输出为:
array(2) {
  ["_id"]=>
  object(MongoId)#6 (0) {
  }
  ["i"]=>
  int(71)
  ["_ns"]=>
  "testCollection"
}
登入後複製

10.查询一系列文档

我们可以从集合中查询一系列文档。

例如,如果你想获得‘i’>50的所有文档,我们可以按下面这样去写

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->database->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$query = array("i"=>array('$gt'=>50));
登入後複製
$cursor = $coll->find($query);
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
while($cursor->hasNext())
登入後複製
{
登入後複製
登入後複製
登入後複製
登入後複製
var_dump($cursor->getNext());
登入後複製
登入後複製
登入後複製
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
我们也可以查询一个范围:比如 20<?php
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $connection->db->collectionName;
登入後複製
登入後複製
登入後複製
登入後複製
$query = array('i'=>array('$gt'=>20,"\$lte"=>30));
登入後複製
$cursor = $collection->find($query);
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
while($cursor->hasNext)
登入後複製
登入後複製
{
登入後複製
登入後複製
登入後複製
登入後複製
var_dump($cursor->getNext());
登入後複製
登入後複製
登入後複製
}
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$gt 大于; $gte 大于等于 ; $in  范围 ; $it 小于;$lte小于等于;  
<span>find</span><span>(</span> <span>{</span> <span>qty</span><span>:</span> <span>{</span> <span>$in</span><span>:</span> <span>[</span> <span>5</span><span>,</span> <span>15</span> <span>]</span> <span>}</span> <span>}</span> <span>)</span>
登入後複製

$ne 查询所有不等于该元素的数据;

$nin 查询不在范围内的所有数据

另外注意:单引号下$字符不需要转义字符,但是双引号下需要转义字符

11.创建一个索引

MongoDB支持索引,而且索引可以非常容易的加到集合中。

为了创建一个索引,你需要定义一个字段和方向:升序(1)或者降序(-1)。

以下创建了一个升序的索引在‘i’字段上:

<?php 
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$connection = new MongoClient();
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
$collection = $collection->database->collectionName();
登入後複製
登入後複製
登入後複製
登入後複製
$collection->ensureIndex(array("i"=>1));//创建一个在‘i’上升序的索引
登入後複製
$collection->ensureIndex(array("i"=>-1, "j"=>1));//创建一个在‘i’上降序,在‘j’上升序的索引。
登入後複製
?>
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
登入後複製
当数据增长时,索引就成了数据库良好的读取性能的关键。
如果你对索引读取性能还不熟悉,你可以参考MongoCollection::ensureIndex()MongoCollection::ensureIndex()的相关文档。
登入後複製

参考:http://www.php.net/manual/zh/mongo.tutorial.connecting.php































相關標籤:
來源:php.cn
上一篇:php上传文件代码 下一篇:PHP实现对MongoDB的基础操作
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
相關專題
更多>
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板