MongoDB介绍及下载与安装
引言
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性
- 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
- 文件存储格式为BSON(一种JSON的扩展)
- 可通过网络访问
所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。
模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。
MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB
在32位模式运行时支持的最大文件尺寸为2GB。
MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。
以上为随便摘的,其实就是非传统的非关系数据库,现在归到文档型数据库分类之中,注意32位操作系统支持的最大文件为2GB,所以做大文件海量储存的朋友要选择64位的系统安装。开始我们的下载安装之路吧。
一、下载
MongoDB的官网是:http://www.mongodb.org/
MongoDB最新版本下载在官网的DownLoad菜单下:http://www.mongodb.org/downloads
本人选择的是Windows 32-bit 1.8.1版本
MongoDB For .net 驱动开发包位于官网的Driver菜单下(含其它语言开发链接):https://github.com/mongodb/mongo-csharp-driver/downloads
本人操作系统为Windows7 专业版,选择MongoDB版本为Windows 32-bit 1.8.1,开发包为VS2008版本
开始我们的安装过程了
二、安装
1.解压mongodb-win32-i386-1.8.1.zip ,创建路径C:\Program Files\mongodb ,将解压后的Bin文件Copy to 此文件夹下
2.C:\Program Files\mongodb 下建立Data文件夹 C:\Program Files\mongodb\data ,然后分别建立db,log两个文件夹,至此mongodb下有以下文件夹
C:\Program Files\mongodb\bin
C:\Program Files\mongodb\data\db
C:\Program Files\mongodb\data\log
在log文件夹下创建一个日志文件MongoDB.log,即C:\Program Files\mongodb\data\log\MongoDB.log
完成以上工作后,你为奇怪为什么要建立这些文件夹(因为,Mongodb安装需要这些文件夹,默认安装是不用创建,但是文件都为安装到C:\data\下)
3.几种安装方式介绍
3.1 程序启动方式
运行cmd.exe 进入DOS命中界面
> cd C:\Program Files\mongodb\bin
> C:\Program Files\mongodb\bin>mongod -dbpath “C:\Program Files\mongodb\data\db”
执行此命令即将mongodb的数据库文件创建到C:\Program Files\mongodb\data\db 目录,不出意外的会看到命令最后一行sucess的成功提示
此时数据库就已启动,该界面为Mongo的启动程序,关闭后可直接双击bin下的mongod.exe (注意是d,这个是启动程序)
启动程序开启后,再运行mongo.exe 程序(注意没有d) ,界面如下

测试数据库操作
>help (查看相关信息)
>db.foo.insert({a:1}) (往foo表插入a,1字段值,foo表为默认表)
>db.foo.find() (查看foo表数据)
结果如下:

可以看到插入了3条记录分别人a,cctv,set 。
当mongod.exe被关闭时,mongo.exe 就无法连接到数据库了,因此每次想使用mongodb数据库都要开启mongod.exe程序,所以比较麻烦,接下来我们将
MongoDB安装为windows服务吧
3.2 windows service方式
运行cmd.exe
> cd C:\Program Files\mongodb\bin
> C:\Program Files\mongodb\bin>mongod –dbpath “C:\Program Files\mongodb\data\db” –logpath “C:\Program Files\mongodb\data\log\MongoDB.log” –install –serviceName “MongoDB”
这里MongoDB.log就是开始建立的日志文件,–serviceName “MongoDB” 服务名为MongoDB
运行命令成功为如下图:

引时服务已经安装成功,运行
>NET START MongoDB (开启服务)
>NET stop MongoDB (关闭服务)
>
> C:\Program Files\mongodb\bin>mongod –dbpath “C:\Program Files\mongodb\data\db” –logpath “C:\Program Files\mongodb\data\log\MongoDB.log” –remove –serviceName “MongoDB” (删除,注意不是–install了)
其它命令可查阅help命令或官网说明。
查看服务

运行bin文件夹下mongo.exe 客户端测试一下吧。测试同3.1相同 。
3.3 守护进程方式创
–fork 以守护进程方式运行MongoDB,创建服务器进程
>C:\Program Files\mongodb\bin>mongod –port 10220 –fork –dbpath “C:\Program Files\mongodb\data\db” –logpath “C:\Program Files\mongodb\data\log\MongoDB.log”
forked process : 44086
all output going to : MongoDB.log
到此几种安装就介绍完了。
4、停止MongoDB
最稳妥的方式,处理完当前所有操作并将缓存的数据保存到磁盘上才停止
>user admin
>db.shutdownServer();
当然我们也可以直接关闭进程,但这种方式会导致缓存中的数据未急时刷新保存到磁盘上而丢失。
MongoDB管理界面
MongoDB的工具还比较多,没有一个能够统一全部工具的,不过推荐使用RockMongo,这个工具确实速度很快,而且很顺手,支持中文
到RockMongo下载安装包: http://rockmongo.com/wiki/introduction?lang=zh_cn
如果Apache有根目录,移动到根目录下,否则自己建立一个/etc/apache2/conf.d/rockmongo.conf,写入
Alias /rockmongo /var/www/rockmongo
<Directory /var/www/rockmongo>
Options FollowSymLinks
DirectoryIndex index.php
</Directory>
然后要安装php-mongo模块
apt-get install php5-mongo
修改php配置文件
echo "extension=mongo.so" >> /etc/php5/apache2/php.ini
然后访问http://localhost/rockmongo即可,帐号密码都是admin
————————————————————————
MongoDB PHP操作类:
<?php
/*
require 'MongoDB.php';
$mongo = new QMongoDB('localhost:27017',true);
//Insert
$result =$mongo -> insert('yyy', array('A' => 789, 'B' => array('time'=>time(),'date'=>date('Y-m-d'))));
//Update
$where = array('name' => 'QQ223');
$dat = array('name' => 'MM233', 'sex' => 0);
$result = $mongo -> update('yyy',$where, $dat);
//Remove
$result = $mongo->remove('yyy',array());
$result = $mongo->remove('yyy',array('A'=>123));
//Find
//表名,条件 array('操作符'=>x),结果条件,字段
//$result = $mongo ->find('yyy',array('A'=>array('$gt'=>125)),array('limit' => 5,'skip'=>1,'sort'=>array('A'=>1)),array('A','B'));
$result = $mongo ->find('yyy',array('A'=>123),array('limit' => 5,'skip'=>1,'sort'=>array('A'=>1)),array('A','B'));
//FindOne
$result = $mongo -> findOne('yyy', array('A'=>'123'), array());
*/
class QMongoDB
{
private $mongo = null;
private $db = null;
private $error;
public function getInstance($mongo_server)
{
if (self::$mongo == null) {
self::$mongo = new self($mongo_server);
}
return self::$mongo;
}
/**
* @param $mongo_server 连接字串
* 链接远程主机: 127.0.0.1; 链接指定端口主机: 127.0.0.1:27017; 带用户名密码: mongodb://sa:123@localhost; 链接多个服务器:localhost:27017,localhost:27018
* @param bool $connect
* @param bool $replicaSet 持久连接
*/
public function __construct($mongo_server = 'localhost', $connect = true, $replicaSet = false)
{
try {
$this->mongo = new MongoClient($mongo_server, array('replicaSet' => $replicaSet));
return $this->mongo;
} catch (MongoConnectionException $e) {
$this->error = $e->getMessage();
return false;
}
}
/**
* 选择数据库
* @param $databse 数据库
*/
public function selectDB($databse)
{
$this->db = $this->mongo->selectDB($databse);
}
/**
* 创建索引,如果索引已经存在则返回
* @param $column 数据表
* @param $index 索引,array('id'=>1),在id字段建立升序索引
* @param array $index_param 其他条件,是否唯一索引等
* @return bool 返回值
*/
public function ensureIndex($column, $index, $index_param = array())
{
$db_name = $this->db;
$index_param['safe'] = 1;
try {
$this->mongo->$db_name->$column->ensureIndex($index, $index_param);
return true;
} catch (MongoCursorException $e) {
$this->error = $e->getMessage();
return false;
}
}
/**
* 插入数据
* @param $column 数据表
* @param $record 记录
* @return bool 成功返回id失败false
*/
public function insert($column, $record)
{
$db_name = $this->db;
try {
$this->mongo->$db_name->$column->insert($record);
return $record['_id'];
} catch (MongoCursorException $e) {
$this->error = $e->getMessage();
return false;
}
}
/**
* 更新数据
* @param $column 数据表
* @param $condition 条件
* @param $data 数据
* @param array $options 更新选择 upsert/multiple
* @return bool 返回值 成功true, 失败false
*/
public function update($column, $condition, $data, $options = array())
{
$db_name = $this->db;
$options['safe'] = 1;
if (!isset($options['multiple'])) {
$options['multiple'] = 0;
}
try {
$this->mongo->$db_name->$column->update($condition, $data, $options);
return true;
} catch (MongoCursorException $e) {
$this->error = $e->getMessage();
return false;
}
}
/**
* 移出记录
* @param $column 数据表
* @param $condition 条件
* @param array $options 删除选项 juntOne
* @return bool 返回值
*/
public function remove($column, $condition, $options = array())
{
$db_name = $this->db;
// $options['safe'] = 1;
try {
$this->mongo->$db_name->$column->remove($condition, $options);
return true;
} catch (MongoCursorException $e) {
$this->error = $e->getMessage();
return false;
}
}
/**
* 查询记录数
* @param $column 数据表
* @param array $condition 查询条件
* @return int
*/
public function count($column, $condition = array())
{
$db_name = $this->db;
return $this->mongo->$db_name->$column->count($condition);
}
/**
* 查询记录
* @param $column 数据表
* @param array $condition 查询条件 array('字段'=>array('操作符'=>x)) 操作符= $gt,$lt,$gte,$lte; array('字段'=>x);
* @param array $result_condition 结果筛选条件/limit=array('limit'=>x),skip=array('skip'=>x)分页筛选条件同limit一起使用
/sort=array('sort'=>array('字段'=>1升序/-1降序))/等
* @param array $fields 字段 array('fields1','fields2')
* @return array|bool 返回结果集
*/
public function find($column, $condition = array(), $result_condition = array(), $fields = array())
{
$db_name = $this->db;
foreach($condition as $key=>$value){
if($key == '_id'){
$condition['_id'] = new MongoId($value);
}
}
$cursor = $this->mongo->$db_name->$column->find($condition, $fields);
if (!empty($result_condition['limit'])) {
$cursor->limit($result_condition['limit']);
if (!empty($result_condition['skip'])) {
$cursor->skip($result_condition['skip']);
}
}
if (!empty($result_condition['sort'])) {
$cursor->sort($result_condition['sort']);
}
$result = array();
//var_dump($cursor->hasNext());
try {
while ($cursor->hasNext()) {
$result[] = $cursor->getNext();
}
} catch (MongoConnectionException $e) {
$this->error = $e->getMessage();
return false;
} catch (MongoCursorTimeoutException $e) {
$this->error = $e->getMessage();
return false;
}
return $result;
}
public function getMongo(){
return $this -> mongo->getConnections();
}
/**
* 查询单条记录
* @param $column 数据表
* @param array $condition 条件 array()
* @param array $fields 字段 array('fields1','fields2')
* @return array|null 返回值
*/
public function findOne($column, $condition = array(), $fields = array())
{
$db_name = $this->db;
foreach($condition as $key=>$value){
if($key == '_id'){
$condition['_id'] = new MongoId($value);
}
}
return $this->mongo->$db_name->$column->findOne($condition, $fields);
}
/**
* 返回错误信息
* @return string
*/
public function getError()
{
return $this->error;
}
}
下载:
