MongoDB 第一篇
关系型数据库和非关系型数据库的优缺点:
mysql:数据结构一致性高,但并发处理弱,读写能力差
mongodb:数据灵活性更高,并发处理强,读写速度快
MongoDB数据库特点:
- 由c++编写的数据库管理系统
- 支持丰富的增删改查操作
- 由丰富的存储类型,技术相对成熟
- 支持众多的编程语言操作
- 使用方便,便于扩展和部署
MongoDB安装:
linux : sudo apt-get install mongodb
安装位置:/var/lib/mongodb
配置文件:/etc/mongodb.conf
命令集:/user/bin
MongoDB命令:
mongod --dbpath 文件名 设置数据库的存储地址
mongod --port 端口号 设置数据库连接端口
mongo 启动mongo
mongodump -h host -d dbname -o dir 数据库备份
e.g mongodump -h 127.0.0.1 -d stu -o . #备份本机中的stu库到当前文件下
mongorestore -h host:port -d dbname path 数据库的恢复
e.g mongorestore -h 127.0.0.1:27017 -d student ./stu #将当前文件下的stu库恢复到本机中的student库中
数据库监控命令
mongostat 查看数据库运行状态
insert query update delete : 每秒执行增查改删的次数
command : 每秒执行mongo命令次数
flushes : 和磁盘交互情况
vsize res : 使用虚拟内存和物理内存情况
time : 运行时间
mongotop 检测每个数据库中数据表的读写情况
ns 数据集合
total 总时长
read 读时长
write 写时长
数据库操作:
use stu #创建数据库
show dbs #查看数据库
db.dropDatabase() #删除数据库
** 全局变量db: db变量代表当前正在使用的数据库,如果不选择任何数据库 db 为 系统默认数据库 test
集合操作
db.createCollection(collection_name) #创建集合名
db.class2.insert({"name":"lucy","age":"20","sex":"m"}) #通过插入数据创建集合class2
show collections or show tables #查看集合
db.collection_name.drop() #删除集合
db.collection_name.renameCollection("new_name") #集合重命名
文档
1.文档是mongodb数据库中基本的数据组成形式类似字典
2.文档由键值对构成,每个键值对表达一个数据项
3.mongodb文档属于bson类型数据
4.文档中的键值对是有序的
数据库存储的数据类型:
类型 值
数字 整数 小数
bool true false
Array 数组
Date 日期时间
Timestamp 时间戳
String 字符串
Binary data 二进制字符串
Null 空 null
Object 内部文档(对象)
regex 正则表达式
code 代码
ObjectId ObjectId字串
ObjectId类型
"_id" : ObjectId("5bd13b8049c6eee82a51e915")
_id: 当插入mongodb文档时会自动生成_id域作为主键id
值 : ObjectId数据,为了和其他的值不重复
24位16进制编码
8位文档创建时间 6位机器ID 4位进程id 6位计数器
MongoDB增删改查操作
插入文档
insert 插入文档
db.collection_name.insertOne() #插入单个文档
db.collection_name.insertMany([{},{},{}]) #插入多条文档
db.collection_name.insert() #其功能:insertOne + insertMany
save 插入文档
db.collection.save() #同insert相同,可以插入一条或多条,如果文档存在则会替换原来的文档
文档查询 find
db.collection_name.find(query,field)
功能:查询所有符合条件的文档
参数:query 表示查询条件,是一个键值对文档,默认表示查找所有内容
field 表示查找的域,是一个键值对文档,0表示不查找,1表示查找
e.g db.class2.find({},{_id:0,name:1}) #表示不查找_id域,只查找name域内容
db.collection_name.findOne(query,field)
功能:查找第一条符合条件的文档
参数:使用同find
e.g. db.class2.findOne({age:17},{_id:0}) ##表示不查找_id域,显示age = 17的所有文档
query 操作符的使用
比较操作符
$eq 等于 =
e.g. 年龄等于17
db.class0.find({age:{$eq:17}},{_id:0})
$lt 小于 <
e.g. 姓名小于Tom (字符串也可以比较大小)
db.class0.find({name:{$lt:"Tom"}},{_id:0})
$gt 大于 >
e.g. 找到大于16且小于19的 (条件文档中可以有多个键值对,多键值对为并且关系)
db.class0.find({age:{$gt:16,$lt:19}},{_id:0})
$lte 小于等于 <=
e.g. db.class0.find({age:{$lte:17}},{_id:0})
$gte 大于等于 >=
e.g. db.class0.find({age:{$gte:17}},{_id:0})
$ne 不等于 !=
e.g. db.class0.find({age:{$ne:17}},{_id:0})
$in 包含
e.g. 查找年龄在数组范围中的文档
db.class0.find({age:{$in:[16,18,20]}},{_id:0})
$nin 不包含
e.g. :查找年龄不在数组范围中的文档
db.class0.find({age:{$nin:[17,19,21]}},{_id:0})
逻辑操作符
1、表示逻辑与
1. 在query文档中逗号隔开的多个键值对即表示与关系
e.g. 年龄等于17 并且 性别为女
db.class0.find({age:17,sex:'w'},{_id:0})
2. $and 表示逻辑与
e.g. 年龄等于17 并且 性别为女
db.class0.find({$and:[{age:17},{sex:'w'}]},{_id:0})
2、表示逻辑或 $or
e.g. 年龄小于17 或者 性别为女
db.class0.find({$or:[{age:{$lt:17}},{sex:'w'}]},{_id:0})
3、表示逻辑非 $not
e.g. 年龄不大于17
db.class0.find({age:{$not:{$gt:17}}},{_id:0})
4、表示逻辑既不也不 $nor not (A or B) (not A) and (not B)
e.g. 既不是男生,年龄也不大于18
db.class0.find({$nor:[{sex:'m'},{age:{$gt:18}}]},{_id:0})
5、条件混合
年龄(大于18 或者 小于17) 并且 要求性别为女
db.class0.find({$or:[{age:{$gt:18}},{age:{$lt:17}}],sex:'w'},{_id:0})
年龄大于等于17的男生 或者 姓名为Abby
db.class0.find({$or:[{age:{$gte:17},sex:'m'},{name:'Abby'}]},{_id:0})
数组类型查找
数组 : 一组数据的有序集合 ,使用[]表示
- 有序的
- 数据类型可以不相同
查找数组中包含某一项
e.g. 查找score数组中包含90的文档
db.class3.find({score:90},{_id:0})
查找数组中同时包含多项 $all
e.g. 查找score数组中同时包含88,90的文档
db.class3.find({score:{$all:[88,90]}},{_id:0})
根据数组项数查找 $size
e.g. 查找数组中包含3项的文档
db.class3.find({score:{$size:3}},{_id:0})
选择数组的查询部分 $slice (用于field参数)
e.g. 显示数组的前两项
db.class3.find({name:'小明'},{_id:0,score:{$slice:2}})
e.g. 跳过数组第一项显示后面两项
db.class3.find({name:'小明'},{_id:0,score:{$slice:[1,2]}})
其他查找操作符
$exists 判断一个域是否存在 操作符值为bool
e.g.查找不存在sex域的文档(false表示不存在,true表示存在)
db.class0.find({sex:{$exists:false}},{_id:0})
$mod 通过除数余数筛选文档
e.g. 筛选年龄除以2余数为1的文档
db.class0.find({age:{$mod:[2,1]}},{_id:0})
$type 根据数据类型筛选
e.g. 查找name数据类型为 ‘2’ 的文档
db.class0.find({name:{$type:2}},{_id:0})
* mongo数据类型和数字的对照参看文档
double : 1
string : 2
* 可以通过查看 www.mongodb.com 下的docs文档查找新的操作符使用方法