mongodb php 开发,基于MongoDB的php应用开发

一、连接数据库主机

连接本地主机,端口为27017:

$connection = new Mongo();

连接远程主机,端口为默认端口:

$connection= new Mongo( "192.168.2.1" );

连接远程主机,端口为指定端口:

$connection = new Mongo( "192.168.2.1:65432" );

选择数据库,如果指定的数据库不存在,则会自动创建一个新的数据库,有2种方法:

$db = $connection->selectDB('dbname');

$db = $connection->dbname;

选择集合(collection),与使用关系型数据库中的表类似,有2种方法:

$collection = $db->selectCollection('people');

$collection = $db->people;

二、插入新文档(document)

collection对象用来执行信息管理,例如,想存储一个关于某人的信息,可以如下编码:

$person = array(

'name' => 'Cesar Rodas',

'email' => 'crodas@php.net',

'address' => array(

array(

'country' => 'PY',

'zip' => '2160',

'address1' => 'foo bar'

),

array(

'country' => 'PY',

'zip' => '2161',

'address1' => 'foo bar bar foo'

),

),

'sessions' => 0,

);

$safe_insert = true;

$collection->insert($person, $safe_insert);

$person_identifier = $person['_id'];

其中:

$safe_insert参数用于等待MongoDB完成操作,以便确定是否成功,默认值为false,当有大量记录插入时使用该参数会比较有用。

插入新文档后,MongoDB会返回一个记录标识。

三、更新文档

例如,更新上面已经创建的个人信息,增加sessions属性值,在第1个address处增加address2属性,删除第2个address,代码如下:

首先,定义一个filter(过滤器)告诉MongoDB要更新一个指定的文档

$filter = array('email' => 'crodas@php.net');

$new_document = array(

'$inc' => array('sessions' => 1),

'$set' => array(

'address.0.address2' =>

'Some foobar street',

),

'$unset' => array('address.1' => 1),

);

$options['multiple'] = false;

$collection->update(

$filter,

$new_document,

$options

);

MongoDB也支持批量更新,与关系型数据库类似,可以更新给定条件的所有文档,如果想这么做的话,就需要设置options的multiple的值为true.

四、查询文档

定义一个符合给定标准的条件过滤器,通过使用查询选择器来获取文档。

例,通过e-mail address来获取信息:

$filter = array('email' => 'crodas@php.net');

$cursor = $collection->find($filter);

foreach ($cursor as $user)

{

var_dump($user);

}

例,获取sessions大于10的信息:

$filter = array('sessions' => array('$gt' => 10));

$cursor = $collection->find($filter);

例,获取没有设置sessions属性的信息:

$filter = array(

'sessions' => array('$exists' => false)

);

$cursor = $collection->find($filter);

例,获取地址在PY并且sessions大于15的信息:

$filter = array(

'address.country' => 'PY',

'sessions' => array('$gt' => 10)

);

$cursor = $collection->find($filter);

有一个重要的细节需要注意,只有当需要结果的时候查询才会被执行,在第1个例子中,当foreach循环开始时,查询才被执行。

这是个很有用的特性,因为这可以通过在游标(cursor)中增加选项来取回结果,恰好在定义查询后,执行查询前这个时刻。例如,可以设置选项来执行分页,或者获取指定数目的匹配的文档。

$total = $cursor->total();

$cursor->limit(20)->skip(40);

foreach($cursor as $user) {

}

五、获取文档的聚类

MongoDB支持结果的聚类,类似于关系数据库,可以使用count,distinct和group等聚类操作。

聚类查询返回数组(array),而不是整个文档对象。

分组操作允许定义用Javascript编写的MongoDB服务器端功能,该操作执行分组属性。因为可以执行许多带有分组值的操作类型,所以会更灵活,但是相比SQL执行例如SUM(),AVG()等

简单的分组操作来说,这还是有些困难。

下面这个例子演示了如何获取国家的的地址列表,以及匹配地址的国家出现的次数:

$countries = $collection->distinct(

array("address.country")

);

$result = $collection->group(

array("address.country" => True),

array("sum" => 0),

"function (obj, prev) { prev.sum += 1; }",

array("session" => array('$gt' => 10))

);

六、删除文档

删除文档与获取或更新文档很类似。

$filter = array('field' => 'foo');

$collection->remove($filter);

要注意,默认所有符合条件的文档都会被删除,如果只想删除符合条件的第1个文档,那么在给remove函数的第二个参数赋值为true。

七、索引支持

有一个很重要的特点,使得决定选择MongoDB,而不是选择其它的类似的面向文档的数据库,这个特点就是对索引的支持,这和关系型数据库的表索引很类似,并不是所有的面向文档的数据库都

提供内置的索引支持。

使用MongoDB的创建索引功能可以避免在查询期间在所有文档中进行操作,这就象关系数据库中使用索引来避免全表查询一样。这可以加速那些涉及到索引属性的符合条件的文档的查询。

例如,如果想在e-mail地址属性上建立唯一的索引,如下所示:

$collection->ensureIndex(

array('email' => 1),

array('unique' => true, 'background' => true)

);

第1个数组参数描述将要成为索引的所有属性,可以是1个或多个属性。

默认情况下,索引的创建是一个同步操作,所以,如果文档数目很大的话,把索引的创建放在后台运行会是个好主意,就象上面例子所演示的。

只有一个属性的索引可能不够用,下面这个例子演示如何通过在2个属性上定义索引来加速查询。

$collection->ensureIndex(

array('address.country' => 1, 'sessions' => 1),

array('background' => true)

);

每个索引的值定义了索引的顺序:1表示降序(descending),-1表示升序(ascending)

索引顺序在有排序选项的查询优化中是有用的,如下例所示:

$filter = array(

'address.country' => 'PY',

);

$cursor = $collection->find($filter)->order(

array('sessions' => -1)

);

$collection->ensureIndex(

array('address.country' => 1, 'sessions' => -1),

array('background' => true)

);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值