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的连接十分简单。如下所示:
你也可以定义一个地址,如下所示:
2 | $mongo = new Mongo( '127.0.0.1:1234' ); |
现在我们必须选择一个数据库,才可以进行操作,如下:
4 | $db = $mongo ->selectDB( 'ebooks' ); |
注意:如果选择的数据库不存在,则MongoDB会自动创建。
Collections(收集)
和SQL数据库使用use tables相反,我们使用collections。简单地说这是收藏的文件。从一个传统的sql开发者的立场来说,这些将会与一个数据库 table(collection)和一个table(collection)的入口相对比。然而,MongoDB的文件数据库方式更加灵活。每一个文件都可以有子文档。
创建或检索一个(Collections)收集:
2 | $collection = $db ->ebooks; |
4 | $collection = $db ->selectCollection( 'ebooks' ); |
如上所示,如果收集不存在,则会自动创建。最长的收集名长度为128个字符。
注意:收集名包含了数据库名和索引,所以做好把收集(collection)名控制在80个字符之内。
2, 插入文件数据。
插入一个文件十分简单,如下所示:
1 | $authors = $db ->authors; |
3 | 'first_name' => 'Thomas' , |
4 | 'last_name' => 'Johnson' , |
7 | $author_id = $authors ->insert( $author ); |
插入的返回值是一个对象id,你也可以传递一个额外的参数'safe',来告诉MongoDB直接返回。这样处理数据更加快,但是你并不知道是否成功插入数据。这个选项在插入大量数据时十分有用。
3,查询文件数据。
先假定在我们的ebooks collection(实际上就是SQL类数据库的table表)中有如下数据:
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 , |
7 | $ebooks ->insert( $ebook ); |
和
2 | 'title' => 'php and mongo: A simple scalable CMS tutorial' , |
3 | 'description' => "Some nice description here. " , |
4 | 'author_id' => $author_id , |
7 | $ebooks ->insert( $ebook ); |
我们可以像下面示例中那样对作者的ebook进行检索。
2 | 'author_id' => $author_id |
4 | $my_ebooks = $ebooks ->find( $filter ); |
5 | foreach ( $my_ebooks as $book ) { |
6 | echo $book [ 'title' ] . "<br />" ; |
7 | echo $book [ 'description' ] . "<br />" ; |
容易让人疑惑的是通过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 ); |
5 | $authors ->update( $filter , $update ); |
假定我们想要向ebooks中添加一些信息,照下面做就可以:
1 | $filter = array ( '_id' => $ebook_id ); |
3 | 'name' => 'Thomas Johnson' , |
4 | 'email' => 'tomfmason@phpfreaks.com' , |
6 | 'review' => 'MongoDB is awesomesauce' |
9 | '$push' => array ( 'reviews' => $review ) |
11 | $ebooks ->update( $filter , $update ); |
参见MongoDB Modifier Operations documentation获取更多关于MongoDB的模式修改器,如$set, $unset,$push等信息
5,删除文件数据。
删除文件数据和查询、更新操作是一样的,如下:
2 | $filter = array ( '_id' => $ebook_id ); |
3 | $ebooks ->remove( $filter ,true); |
GridFS
“GridFS提供了一种机制---对于透明划分在多样文件中的一个大文件。这使我们能够有效地储存的大型物体,而且在特别大的文件,例如视频,允许范围内操作(例如,只取回文件的前第N个字节)。”
在我个人看来,MongoDB的GridFS是其本身最重要的一部分。GridFS很像一个标准收取存储文件。这是一个简单的例子:
4 | 'description' => 'An awesome example ebook' , |
5 | 'ebook_id' => '4cffb69f726e24d404000000' , |
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 ); |
3 | echo $file_data ->file[ 'description' ]; |
结论:
在得到一些私人的评论中我想我要回来,然后添加一个更好的结论。简而言之, MongoDB给我留下了深刻的印象,我将尽可能多的使用MongoDB。然而,我们都需要牢记:并非每一个工具对每一份工作都是合适的。如果你需要一个高度可靠的数据库,速度极快的读/写或要更新率非常高,那么MongoDB是解决这些类型问题的完美工具。