MongoDB与PHP的简单应用

Posted on 2013-02-07 21:34  chace0120  阅读(1817)  评论(0编辑  收藏  举报

1. MongoDB的PHP驱动

MongoDB在PHP驱动程序是一个PHP扩展,在绝大部分平台下都很容易安装。PHP5.1及以上版本的系统就可以了。

首先查看phpinfo()的输出,确定运行的PHP版本和VC版本。这里VC版本可以简单地理解为PHP的编译机制,如果用的是Apache,则需要VC6,否则需要VC9,例如IIS。有些Zend用的VC8。还要注意是否是线程安全的(Thread Safety),对应到PHP的驱动包名中缩写为“ts”。同时要明确extension_dir的值,所有的扩展组件都放在这里。

2. 在Windows下安装PHP的MongoDB扩展

到官网下载和PHP版本、VC版本和线程安全相匹配的包,解压后,将php_mongo.dll移动到extension_dir目录。

如果启动了应用服务器(Apache、WAMPP等),需要重启,下次启动PHP时会自动加载Mongo扩展。

3. PHP驱动程序的简单示例

Mongo类就是一个到数据库的连接。默认情况下,构造器尝试连接本地默认端口处运行的数据库服务器。MongoDB中的文档用PHP中的关联数组表示,{“foo” : “bar”}对应PHP中的array(“foo” => “bar”)。MongoDB中的数组对应表示为PHP中的数组,[“foo”, “bar”, “baz”]对于PHP中的array(“foo”, “bar”, “baz”)。对于null、布尔型、数字型、字符串和数组,PHP驱动使用了PHP的本机类型。对于其他类型,可参看手册。

示例1:

获取数据库test的users集合,不用担心users集合是否存在,若不存在该集合,程序会在数据库中自动创建。如下:

1 <?php
2 
3          $connection = new Mongo();
4 
5          $collection = $connection->test->users;
6 
7 ?>

当然还可以继续访问子集合,例如获取users.addresses集合:

1 $collection = $connection->users->addresses;

注意:这里创建MongoDB的连接时,new Mongo()中没有传任何参数,那么默认连接到localhost:27017的MongoDB服务器上。如果要创建到某个主机的某个端口的连接,可以编写如下代码:

1 $connection = new Mongo(‘example.com’);    //连接到example.com:27017
2 $connection = new Mongo(‘example.com:65432‘);          //连接到example.com:65432

有人会有疑问,如果MongoDB是以安全认证的机制运行的,那么怎么连接服务器呢?可以通过传入用户名和密码获取连接:

1 $connection = new Mongo(‘cx:123456@example:65432/test’);

有人又会注意到多出了“test”,这是所传入的用户名和密码对应的数据库。如果不指明用所传的用户名和密码去哪个数据库去验证,那么默认为admin数据库。

关于Mongo类构造函数的参数还有许多,可以参考PHP开发手册。

示例2:

向users集合中插入一个文档:

1 $user = array(“username” => “cx”, “age” => 23);
2 
3 $collection->insert($user);

注意:MongoDB数据库只接受utf-8编码的数据,否则插入数据时会报错。假如我们插入的文档中的键值包含中文字符,在插入之前,需要将中文字符转换成utf-8编码。还有一种解决办法,就是使用MongoBinData类。用非utf-8编码的字符串来实例化MongoBinData类,然后将这个类当作值赋给某个键。例如:

1 $profile = array(‘username’ => ‘foobity’,
2 
3    ‘pic’ => new MongoBinData(‘百老汇’);
4 
5 );

示例3:

输出users集合中第一个文档的id号:

1 $user = $collection->findOne();
2 
3 echo $user[‘_id’];

示例4:

输出所有用户的名字:

1 $cursor = $collection->find();
2 
3 foreach ($cursor as $value)
4 
5 {
6 
7          echo $value[‘username’] . ‘<br/>’;
8 
9 }

或者

1 While ($cursor->hasNext())
2 
3 {
4 
5          $doc = $cursor->getNext();
6 
7          echo $doc[‘username’] . ‘<br />’;
8 
9 }

如果想对查询的结果按用户名进行升序排序,如下:

1 $cursor->sort(array(‘username’ => 1));

注意:由于MongoDB文档的结构很灵活,所以这种情况要确保每个文档都包含这个“username”键。

示例5:

修改users集合中用户名为“lucy”的用户的年龄为20:

1 $collection->update(array(‘username’ => ‘lucy’), array(‘$set’ : array(‘age’ : 20)));

注意:“$set”修改器,MonoDB默认字符是“$”,但PHP中“$”表示变量前缀,所以可以通过用单引号使用“$set”修改器,或者在双引号中转义,如”\$set”,再或者在php.ini文件中设置mongo.cmd_char = “…”,用任何你觉得可以代替$的字符都可以。

这里还可以用save()方法来更新数据。save()方法传入的参数是要修改的文档,如果该文档在集合中已经存在(判断该文档是否含有“_id”键),那么执行更新操作,否则执行插入操作。

示例6:

删除users集合中的用户名为“lucy”的文档:

1 $collection->remove(array(‘username’ => ‘lucy’));

示例7:

给users集合中建立索引:

1 $collection->ensureIndex(‘username’ => 1);

 

Copyright © 2024 chace0120
Powered by .NET 8.0 on Kubernetes