一 mongoDB基本介绍
mongodb是一个nosql数据库,它有高性能、无模式、文档型的特点。他是nosql数据库中功能最丰富,最像关系数据库的。
实例:系统上运行的mongodb的进程,类似于mysql实例;
库:每个数据库都是独立的,有自己的用户,权限,独立存储集合,类似于mysql的库;
集合:由一组文档构成,类似于mysql的表;
文档:mongodb数据库的最小数据集,是由多个键值对有序组合的数据单元,类似于mysql的数据记录;
MongoDb作为nosql数据库,它具有以下特性:
1、面向集合文档存储,适合存储json形式的数据;
2、格式自由,数据格式不固定,数据结构发生变更的同时不会影响程序运行;
3、面向对象的sql查询语句,基本涵盖关系型数据库的所有查询语句;
4、有索引的支持,查询效率更快;
5、支持复制和自动故障转移;
6、可以使用分片集群提升查询性能
针对以上的特性,我们可以在以下场景中采用mongdb数据库:1、应用不需要事务(这一条是最重要的,如果应用的事务的依赖很强,是不能选择该数据库的);2、数据模型无法确定,经常发生变更;3、应用的qps达到2000以上;4、应用存储的数据很大,达到TB级别以上;5、应用需要大量的地理位置查询或者文本查询。因此mongodb使用与游戏,社交,物流,物联网,视频直播这些场景。
二 mongoDB的安装与使用
1 下载MongoDB
官方下载地址:https://www.mongodb.com/download-center/communit
这里的安装是以linux为例的,因为实际生产场景大部分都是在linux进行部署。接下来我看介绍一下mongdb的安装步骤;
1、先进入mongodb的官网MongoDB下载,选择要下载的版本以及系统,需要注意的是,在安装mongodb之前需要先准备好jdk的环境变量,选择好要下载的版本以后,点击copy link,在linux系统中执行以下命令;
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.11.tgz
2 解压安装
2.1解压
tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgz
2.2创建目录/usr/local/mongo
,并将解压完的mongodb
目录移动到/usr/local/mongo
下
mkdir -p /usr/local/mongo
mv mongodb-linux-x86_64-rhel70-4.2.1/* /usr/local/mongo/
2.3切到/usr/local/mongo
目录下,创建目录
mkdir -p data/db #数据库目录
mkdir -p logs #日志目录
mkdir -p conf #配置文件目录
mkdir -p pids #进程描述文件目录
创建好的目录如下:
2.4在conf
目录,增加配置文件mongo.conf
vi /usr/local/mongo/conf/mongo.conf
#数据保存路径
dbpath=/usr/local/mongo/data/db/
#日志保存路径
logpath=/usr/local/mongo/logs/mongo.log
#进程描述文件
pidfilepath=/usr/local/mongo/pids/mongo.pid
#日志追加写入
logappend=true
bind_ip_all=true
#mongo默认端口
port=27017
#操作日志容量
oplogSize=10000
#开启子进程
fork=true
2.5通过配置文件启动mongo
服务端
/usr/local/mongo/bin/mongod -f /usr/local/mongo/conf/mongo.conf
2.6启动mongo
客户端
/usr/local/mongo/bin/mongo --host 127.0.0.1 --port 27017
mongo在创建完成以后会默认存在admin,config,local这三个数据库,其中admin中存储的是mongodb的用户、角色等信息;config中存储的是分片集群基础信息;local中主要存储的是副本集的元数据。
三 MongoDB
基本操作及增删改查
1.基本操作
1.1登录数据库
mogo
1.2查看数据库
show databases;
1.3选择数据库
use 数据库名
如果切该数据库不存在,例如use admin2
,那么会隐式创建这个数据库。
use admin2
如果切换到一个没有的数据库,例如use admin2
,那么会隐式创建这个数据库。
1.4查看集合
show collections
1.5创建集合
db.createCollection('集合名')
1.6删除集合
db.集合名.drop()
1.7删除数据库
通过use
语法选择数据
通过db.dropDataBase()
删除数据库
2.增删改查
2.1添加数据
db.集合名.insert(JSON数据)
如果集合存在,那么直接插入数据。如果集合不存在,那么会隐式创建。
示例:在test2
数据库的c1
集合中插入数据(姓名叫webopenfather
年龄18
岁)
use test2
db.c1.insert({"username":"
webopenfather
","age":"18"})
- 数据库和集合不存在都隐式创建
mongodb
会给每条数据增加一个全球唯一的_id
键
_id
键的组成
自己增加_id
可以,只需要给插入的JSON
数据增加_id
键即可覆盖(但实战强烈不推荐)
db.c1.insert({"_id":"1","uname":"webopenfather", "age":18})
一次性插入多条数据
传递数据,数组中写一个个JSON
数据即可
db.c1.insert([
{"username":"z3","age":"18"},
{"username":"l4","age":"18"},
{"username":"w5","age":"18"}
])
快速插入10
条数据
由于mongodb
底层使用JS
引擎实现的,所以支持部分js
语法。因此:可以写for
循环
for (var i=1; i<=10; i++) {
db.c2.insert({uanme: "a"+i, age: i})
}
2.2查询文档
db.集合名.find(条件[,查询的列])
条件 | 写法 |
查询所有的数据 | {}或者不写 |
查询age=6的数据 | {age:6} |
既要age=6又要性别=男 | {age:6,sex:‘男’} |
查询的列(可选参数) | 写法 |
查询全部列(字段) | 不写 |
只显示age列(字段) | {age:1} |
除了age列(字段)都显示 | {age:0} |
其他语法
运算符 | 作用 |
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | 表示查询某一个字段在某一个范围中的所有文档 |
$nin | 表示查询某一个字段不在某一个范围内的所有文档 |
3实例练习
3.1查询所有数据
db.c1.find()
3.2只查看uname列
db.c1.find({},{uname:1})
3.3除了uname列都查看
db.c1.find({},{uname:0})
3.5查询age
大于5
的数据
db.c1.find({
age:{$gt:5}
})
3.6查询年龄是5岁、8岁、10岁的数据
db.c2.find({
age:{$in:[5,8,10]}
})
3.7只看年龄列
db.c2.find({},{age:1})
3.8只看年龄以外的列
db.c2.find({},{age:0})
4.修改文档
db.集合名.update(条件,新数据[是否新增,是否修改多条,])
新数据此数据需要使用修改器,如果不使用,那么会将新数据替换原来的数据。
db.集合名.update(条件,{修改器:{键:值}}[是否新增,是否修改多条,])
修改器作用
inc递增
rename重命名列
set修改列值
unset删除列
是否新增
指条件匹配不到数据则插入(true是插入,false否不插入默认)
db.c3.update({uname:"zs30"},{$set:{age:30}},true)
是否修改多条
指将匹配成功的数据都修改(true
是,false
否默认)db.c3.update({uname:"zs2"},{$set:{age:30}},false,true)
实例练习
准备工作
use test2;
for(var i = 1; i<= 10; i++){
db.c3.insert( {"uname":"zs"+i,"age":i} );
}
4.1将{uname:"zs1"}
改为{uname:"zs2"}
db.c3.update({"uname":"zs1"},{$set:{"uname":"zs2"}})
4.2给{uname:"zs10"}
的年龄加2
岁或减2
岁
db.c3.update({"uname":"zs10"},{$inc:{age:2}})
递减只需要将2
改为-2
即可。
5.删除文档
db.集合名.remove(条件[,是否删除一条])
是否删除一条 true
:是(删除的数据为第一条)
db.c3.find()
db.c3.remove({},true)
db.c3.find()
false
:否
db.c3.find()
db.c3.remove({"uname":"zs3"})
db.c3.find()
6总结
6.1增
db.集合名.insert(JSON数据)
6.2删
db.集合名.remove(条件 [,是否删除一条t rue是 false否 --默认])
也就是默认删除多条
6.3改
db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])
升级语法db.集合名.update(条件,{修改器:{键:值}})
6.4查
db.集合名.find(条件 [,查询的列])