MongoDB 简介
MongoDB 是由 C++ 语言编写的, 是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下, 添加更多的节点, 可以保证服务器性能. MongoDB 旨在为 web 应用提供可扩展的高性能数据存储解决方案. MongoDB 将数据存储为一个文档, 数据结构由键值 (key=>value) 对组成. MongoDB 文档类似于 JSON 对象. 字段值可以包含其他文档, 数组及文档数组.
MongoDB 主要特点
MongoDB 是一个面向文档存储的数据库, 操作起来比较简单和容易
在 MongoDB 记录中设置任何属性的索引来实现更快的排序
通过本地或者网络创建数据镜像, 使得 MongoDB 有更强的扩展性
如果负载的增加(需要更多的存储空间和更强的处理能力), 它可以分布在计算机网络中的其他节点上这就是所谓的分片
Mongo 支持丰富的查询表达式. 查询指令使用 JSON 形式的标记, 可轻易查询文档中内嵌的对象及数组
MongoDb 使用 update()命令可以实现替换完成的文档 (数据) 或者一些指定的数据字段
Mongodb 中的 Map/reduce 主要是用来对数据进行批量处理和聚合操作
Map 和 Reduce.Map 函数调用 emit(key,value)遍历集合中所有的记录, 将 key 与 value 传给 Reduce 函数进行处理
Map 函数和 Reduce 函数是使用 Javascript 编写的, 并可以通过 db.runCommand 或 mapreduce 命令来执行 MapReduce 操作
GridFS 是 MongoDB 中的一个内置功能, 可以用于存放大量小文件
MongoDB 允许在服务端执行脚本, 可以用 Javascript 编写某个函数, 直接在服务端执行, 也可以把函数的定义存储在服务端, 下次直接调用即可
MongoDB 支持各种编程语言: RUBY,PYTHON,JAVA,C++,PHP,C# 等多种语言
MongoDB 安装简单
MongoDB 的安装
配置 YUM 源仓库
- cd /etc/yum.repos.d/
- vim mongodb-org.repo
- // 创建 yum 仓库, 写入如下内容
- [mongodb-org]
- name=MongoDB Repository
- baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
- gpgcheck=1
- enabled=1
- gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
yum 安装
yum install -y mongodb-org
配置文件修改
配置文件的修改包括 path,dbpath,port 和 bindIp, 如果只在本机使用, 完全可以不做更改直接使用, 也可简单修改其监听地址(bindIp), 为其他地址使用提供方便.
关闭防火墙及 selinux
- systemctl disable firewalld.service
- systemctl stop firewalld.service
- setenforce 0
开启数据库
- systemctl start mongod.service
- netstat -anpt | grep mongod
进入数据库
- mongo // 进入数据库
- db.version() // 查看数据库版本
- show dbs // 查看所有库
- db.getMongo() // 查看当前数据库机器的连接地址
开启多实例
创建 path,dbpath 目录
- mkdir -p /data/mongodb///* 保留原文件属性进行复制
- mkdir /data/mongodb/mongo
- touch /data/mongodb/mongod2.log
- chmod 777 /data/mongodb/mongod2.log
复制并修改配置文件配置文件
- path: /data/mongodb/mongod.log
- dbPath: /data/mongodb/mongo
- port: 27018
- bindIp: 0.0.0.0
启动新实例
mongod -f /etc/mongod2.conf
进入新实例数据库
- mongo --port 27018
- netstat -anpt | grep mongod
数据库管理
数据库基本操作
mongodb 中创建库是和表紧密联系在一起的, 要创建库, 只需要 use 使用即可, 当你没有在库中创建集合(表), 则该库便不会存在, 当你创建了集合之后, 库也相应的同时存在.
- > use python // 若不存在则会自动创建 python 库, 若是不创建集合, 又会自行删除
- > db.createCollection('a') // 创建名称为 a 的集合
- > db.a.insert({"name":"zhangsan","score":90,"hobby":["game","talk","sport"]})
- // 集合中插入数据; 字符串使用双引号; 数值不加双引号; 字符串数组使用 [] 括起来
- > db.users.update() // 更改数据
- > show collections // 查看集合
- > db.a.drop() // 删除集合
- > db.dropDatabase() // 删除数据库
实例演示
- > use stady // 使用库
- switched to db stady
- > db.createCollection('school') // 创建 school 集合
- { "ok" : 1 }
- > db.school.insert({"id":1,"name":"lisi","score":90}) // 向集合中插入数据
- WriteResult({ "nInserted" : 1 })
- > db.school.find() // 查看集合中数据
- { "_id" : ObjectId("5b4843900edf47ef3aa006f3"), "id" : 1, "name" : "lisi", "score" : 90 }
- > for(var i=2;i<=5;i++)db.school.insert({"id":i,"name":"tom"+i})
- // 向集合中插入多条数据
- WriteResult({ "nInserted" : 1 })
- > db.school.find() // 查看集合数据
- { "_id" : ObjectId("5b4843900edf47ef3aa006f3"), "id" : 1, "name" : "lisi", "score" : 90 }
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f4"), "id" : 2, "name" : "tom2" }
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f5"), "id" : 3, "name" : "tom3" }
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f6"), "id" : 4, "name" : "tom4" }
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f7"), "id" : 5, "name" : "tom5" }
- > db.school.findOne({"id":3}) // 查看集合中第三条数据
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f5"), "id" : 3, "name" : "tom3" }
- > a=db.school.findOne({"id":3}) // 查看第三条记录, 并将其赋予别名 a
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f5"), "id" : 3, "name" : "tom3" }
- > typeof(a.id) // 查看属性类型
- number // 属性为数字
- > typeof(a.name) // 查看属性类型
- string // 属性为字符串
- > db.school.update({"id":3},{$set:{"name":"jack"}}) // 修改数据
- WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
- > db.school.findOne({"id":3})
- { "_id" : ObjectId("5b4844e70edf47ef3aa006f5"), "id" : 3, "name" : "jack" }
- > db.school.count() // 统计集合中有多少条记录
- 5
- > db.createCollection('tea') // 创建新集合
- { "ok" : 1 }
- > show tables // 查看库中集合
- school
- tea
- > db.tea.drop() // 删除集合
- true
- > show tables
- school // 集合已删除
- > show dbs // 查看库
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- python 0.000GB
- stady 0.000GB
- > use python
- switched to db python
- > db.dropDatabase() // 删除 python 数据库, 首先必须先进数据库, 在选择删除
- { "dropped" : "python", "ok" : 1 }
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- stady 0.000GB
- >
数据的导入导出
导出库中数据
- [root@Nginx mongodb]#mongoexport -d stady -c school -o /opt/school.json
- // 导出 stady 库中的 school 集合到 / opt 下, 命名为 school.json 注意: 文件名一定是. json 结尾, 要在 linux 模式操作
导入数据到库中
[root@Nginx mongodb]#mongoimport -d stady -c school2 --file /opt/school.json
条件筛选导出
[root@Nginx mongodb]# mongoexport -d stady -c school -q '{"id":{"$eq":3}}' -o /opt/top3.json
备份数据库
- mkdir /backup // 创建备份文件夹
- mongodump -d stady -o /backup/
恢复数据库
mongorestore -d chen --dir=/backup/stady
复制数据库
- db.copyDatabase() // 复制数据库
- #### 实例演示
- db.copyDatabase("stady","stady2") // 将 stady 库复制一个副本 stady2
- show dbs // 查看所有库
- show tables // 查看库中所有集合
复制集合到新实例
实例演示
- mongo -port 27018 // 进入新实例
- db.runCommand({"cloneCollection":"stady.school","from":"172.16.10.27:27017"})
进程管理
实例演示
- db.currentOp()
- db.killOp(1689)
当你觉得某个进程占用资源量特别大时, 可以将其结束, 当你结束其之后, 它又会重新加载, 相当于进程初始化
来源: http://blog.51cto.com/13643643/2141773