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 不需要编译和安装 直接解压开便可以用
到此 mongodb 安装完成
参数解释: --dbpath 数据库路径(数据文件)
启动 /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs &
[root@localhost ~]# pstree -p | grep mongod
|-login(1709)---bash(2033)---mongod(2065)-+-{mongod}(2066) // 2065为主进程 其他都是子进程
| |-{mongod}(2067)
| |-{mongod}(2068)
| |-{mongod}(2069)
| |-{mongod}(2070)
| `-{mongod}(2071)
可以把上面的启动程序加到 /etc/rc.local 下面 这样就随系统自动启动了
关闭 pkill mongod 或 killall mongod
千万不要用kill -9 2065 否则mongodb 再也起不来了 数据目录下会产生个 mongod.lock 的锁文件 删除后才可以正常启动
进到mongo下 在/usr/local/mongodb/bin/mongo 进入
[root@localhost bin]# ./mongo
MongoDB shell version: 1.8.2
connecting to: test
默认会选择test数据库
> show dbs; //显示所有的数据库
admin (empty)
local (empty)
test 0.0625GB
> db // 当前数据库
test
> show tables; 当前数据库下有哪些集合 也就是表
c1
system.indexes
use local 切换到loacl数据库下
db.c1.insert({"name":"zhangsan"});
db.c1.find();
db.c1.update({'name':'zhangsan'},{$set:{"sex":1}})
db.c1.remove() 删除c1集合
php创建,切换,删除数据库
$mongo = new Mongo();
$db = $mongo->selectDB('test'); //切换数据库
创建数据库
$mongo = new Mongo();
$db = $mongo->selectDB('test');
$users = $db->createCollection("users");
$alldb = $mongo->listDBs(); //列出所有数据库
print_r($alldb); //可以看到db创建成功了
在这里要注意一下,如果你不创建一个collection(根关系型数据库的表基本上是一样的),是创建不了数据库的。
删除数据库
$mongo = new Mongo();
$db = $mongo->selectDB('test');
$db->drop();
db 帮助
- db.AddUser(username,password) 添加用户
- db.auth(usrename,password) 设置数据库连接验证
- db.cloneDataBase(fromhost) 从目标服务器克隆一个数据库
- db.commandHelp(name) returns the help for the command
- db.copyDatabase(fromdb,todb,fromhost) 复制数据库fromdb---源数据库名称,todb---目标数据库名称,fromhost---源数据库服务器地址
- db.createCollection(name,{size:3333,capped:333,max:88888}) 创建一个数据集,相当于一个表
- db.currentOp() 取消当前库的当前操作
- db.dropDataBase() 删除当前数据库
- db.eval(func,args) run code server-side
- db.getCollection(cname) 取得一个数据集合,同用法:db['cname'] or
- db.getCollenctionNames() 取得所有数据集合的名称列表
- db.getLastError() 返回最后一个错误的提示消息
- db.getLastErrorObj() 返回最后一个错误的对象
- db.getMongo() 取得当前服务器的连接对象get the server
- db.getMondo().setSlaveOk() allow this connection to read from then nonmaster membr of a replica pair
- db.getName() 返回当操作数据库的名称
- db.getPrevError() 返回上一个错误对象
- db.getProfilingLevel() 获取profile level
- db.getReplicationInfo() 获得重复的数据
- db.getSisterDB(name) get the db at the same server as this onew
- db.killOp() 停止(杀死)在当前库的当前操作
- db.printCollectionStats() 返回当前库的数据集状态
- db.printReplicationInfo() 打印主数据库的复制状态信息
- db.printSlaveReplicationInfo() 打印从数据库的复制状态信息
- db.printShardingStatus() 返回当前数据库是否为共享数据库
- db.removeUser(username) 删除用户
- db.repairDatabase() 修复当前数据库
- db.resetError()
- db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj:1}
- db.setProfilingLevel(level) 设置profile level 0=off,1=slow,2=all
- db.shutdownServer() 关闭当前服务程序
- db.version() 返回当前程序的版本信息
表的帮助
- db.test.find({id:10}) 返回test数据集ID=10的数据集
- db.test.find({id:10}).count() 返回test数据集ID=10的数据总数
- db.test.find({id:10}).limit(2) 返回test数据集ID=10的数据集从第二条开始的数据集
- db.test.find({id:10}).skip(8) 返回test数据集ID=10的数据集从0到第八条的数据集
- db.test.find({id:10}).limit(2).skip(8) 返回test数据集ID=1=的数据集从第二条到第八条的数据
- db.test.find({id:10}).sort() 返回test数据集ID=10的排序数据集
- db.test.findOne([query]) 返回符合条件的一条数据
- db.test.getDB() 返回此数据集所属的数据库名称
- db.test.getIndexes() 返回些数据集的索引信息
- db.test.group({key:...,initial:...,reduce:...[,cond:...]}) 返回分组信息
- db.test.mapReduce(mayFunction,reduceFunction,<optional params>) 这个有点像存储过程
- db.test.remove(query) 在数据集中删除一条数据
- db.test.renameCollection(newName) 重命名些数据集名称
- db.test.save(obj) 往数据集中插入一条数据
- db.test.stats() 返回此数据集的状态
- db.test.storageSize() 返回此数据集的存储大小
- db.test.totalIndexSize() 返回此数据集的索引文件大小
- db.test.totalSize() 返回些数据集的总大小
- db.test.update(query,object[,upsert_bool]) 在此数据集中更新一条数据
- db.test.validate() 验证此数据集
- db.test.getShardVersion() 返回数据集共享版本号