PHP和MongoDB的简介

来源:互联网 发布:mac os 10.11 xcode 编辑:程序博客网 时间:2024/04/30 10:47

MongoDB简介:

我们中的大多数人都已经逐渐的形成了LAMP的概念,但是很多时候维护和测量 LAMP的基本设置显得十分痛苦。通常测量LAMP最困难的部分在于Mysql的设置。运行大数据量的网站(基于Mysql的数据处理和测量)通常是十分复杂的任务。这就是NoSQL诞生的开始。NoSQL是一个非常宽泛的术语,并且NoSQL的一些选项会比其它的数据库更好。目前我坚定地的选择 MongoDB为NoSQL的数据库。尽管MongoDB是Nosql阵营中相对较新的数据库,但是其相当成熟,并且具有令人惊讶的文档。

安装MongoDB

如果你的服务器环境是Nginx,你可以使用perl来进行MongoDB的安装,如下所示:

pecl install mongo

对于windows用户来说,你需要下载MongoDB库和相应的PHP拓展。

同时也不要忘记将MongoDB的拓展添加到你的php的配置文件php.ini中。如下:

extension=mongo.so

可见,安装MongoDB十分的轻而易举。

MongoDB基础

对于那些仅仅有相关数据库经验如Mysql、Postgresql等等的开发人员来说,刚开始时对于文件数据库可能有一些不易于理解。让我们通过定义一些相关的SQL数据库和非传统的文档数据库之间的关键性差异来开始我们的学习。

A,文档并没有预先定义类似table的表结构模式。

B,默认情况下并不支持连接查询,但是我们可以通过编程来实现。

1, 建立一个连接。

建立一个MongoDB的连接十分简单。如下所示:

1<?php
2$mongo = new Mongo();
3?>

你也可以定义一个地址,如下所示:

1<?php
2$mongo = new Mongo('127.0.0.1:1234');
3?>

现在我们必须选择一个数据库,才可以进行操作,如下:

1<?php
2    $db= $mongo->ebooks;
3    //or we can also use
4    $db= $mongo->selectDB('ebooks');
5?>

注意:如果选择的数据库不存在,则MongoDB会自动创建。

Collections(收集)

和SQL数据库使用use tables相反,我们使用collections。简单地说这是收藏的文件。从一个传统的sql开发者的立场来说,这些将会与一个数据库 table(collection)和一个table(collection)的入口相对比。然而,MongoDB的文件数据库方式更加灵活。每一个文件都可以有子文档。

创建或检索一个(Collections)收集:

1<?php
2$collection = $db->ebooks;
3//or like above
4$collection = $db->selectCollection('ebooks');
5?>

如上所示,如果收集不存在,则会自动创建。最长的收集名长度为128个字符。

注意:收集名包含了数据库名和索引,所以做好把收集(collection)名控制在80个字符之内。

2, 插入文件数据。

插入一个文件十分简单,如下所示:

1$authors = $db->authors;
2$author = array(
3    'first_name'=>'Thomas',
4    'last_name'=>'Johnson',
5    'website'=>'http://www.tomfmason.net'
6);
7$author_id = $authors->insert($author);

插入的返回值是一个对象id,你也可以传递一个额外的参数'safe',来告诉MongoDB直接返回。这样处理数据更加快,但是你并不知道是否成功插入数据。这个选项在插入大量数据时十分有用。

3,查询文件数据。

先假定在我们的ebooks collection(实际上就是SQL类数据库的table表)中有如下数据:

1$ebook = array(
2    'title'=> 'An introduction to PHP and Mongodb',
3    'description'=> "Mongodb is an up and coming document oriented database that supports many awesome features including native PHP extension, an easy to use query interface and it is blazing fast. ",
4    'author_id'=>$author_id,
5    'reviews'=>array()
6    );
7$ebooks->insert($ebook);

1$ebook = array(
2    'title'=>'php and mongo: A simple scalable CMS tutorial',
3    'description'=>"Some nice description here. ",
4    'author_id'=>$author_id,
5    'reviews'=>array()
6    );
7$ebooks->insert($ebook);

我们可以像下面示例中那样对作者的ebook进行检索。

1$filter = array(
2    'author_id'=> $author_id
3);
4$my_ebooks = $ebooks->find($filter);
5foreach ($my_ebooksas $book) {
6    echo$book['title'] ."<br />";
7    echo$book['description'] ."<br />";
8}

容易让人疑惑的是通过id查询,假设我们的id是一个字符串'4cffb213726e24640d000000',在如下代码中你是获取不到数据的。

1$author_id = "4cffb213726e24640d000000";
2$filter = array('_id'=>$author_id);
3$author = $authors->findone($filter);

这是因为在MongoDB中id不是一个简单的字符串,而是一个MongId对象。你必须按照下面的方式来操作:

1$author_id = new MongoId("4cffb213726e24640d000000");
2$filter = array('_id'=>$author_id);
3$author = $authors->findone($filter);

4, 更新文件数据。

现在,我们假定作者想要更新他们的网址,这在MongoDB中十分简单:

1$filter = array('_id'=> $author_id);
2$update = array(
3    '$set'=> array('website'=> 'http://www.phpfreaks.com')
4);
5$authors->update($filter,$update);

假定我们想要向ebooks中添加一些信息,照下面做就可以:

1$filter = array('_id'=> $ebook_id);
2$review = array(
3    'name'=> 'Thomas Johnson',
4    'email'=> 'tomfmason@phpfreaks.com',
5    'website'=> 'http://www.tomfmason.net',
6    'review'=> 'MongoDB is awesomesauce'
7);
8$update = array(
9    '$push'=> array('reviews'=> $review)
10);
11$ebooks->update($filter,$update);

参见MongoDB Modifier Operations documentation获取更多关于MongoDB的模式修改器,如$set, $unset,$push等信息

5,删除文件数据。

删除文件数据和查询、更新操作是一样的,如下:

1<?php
2$filter = array('_id'=>$ebook_id);
3$ebooks->remove($filter,true);
4?>

GridFS

“GridFS提供了一种机制---对于透明划分在多样文件中的一个大文件。这使我们能够有效地储存的大型物体,而且在特别大的文件,例如视频,允许范围内操作(例如,只取回文件的前第N个字节)。”

在我个人看来,MongoDB的GridFS是其本身最重要的一部分。GridFS很像一个标准收取存储文件。这是一个简单的例子:

1$meta_data = array(
2    'name'=> "ebook.pdf",
3    'type'=> 'ebook',
4    'description'=> 'An awesome example ebook',
5    'ebook_id'=> '4cffb69f726e24d404000000',
6    'downloads'=> 0
7);
8$grid = $db->getGridFS();
9$file_id = $grid->storeFile(dirname(__FILE__) . DIRECTORY_SEPARATOR .'ebook.pdf', $meta_data);

如果我们用php代码来上传这个电子书我们会使用storeUpload代替。这使得在MongoDB存储php文件上传绝对是轻而易举的。

现在,我们可以像处理其他collection一样来搜索上传的文件。

1$filter = array('_id'=>$file_id);
2$file_data = $grid->findone($filter);
3echo $file_data->file['description'];

结论:

在得到一些私人的评论中我想我要回来,然后添加一个更好的结论。简而言之, MongoDB给我留下了深刻的印象,我将尽可能多的使用MongoDB。然而,我们都需要牢记:并非每一个工具对每一份工作都是合适的。如果你需要一个高度可靠的数据库,速度极快的读/写或要更新率非常高,那么MongoDB是解决这些类型问题的完美工具。



原创粉丝点击