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);