NoSQL Mongodb
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
MongoDB是一个介于关系型数据和非关系型数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,其数据结构由键值(key=>value)对组成。
MongoDB 将数据存储为一个文档,MongoDB 文档类似于 JSON 对象。因此可以存储比较复杂的数据类型。
MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库表单查询的绝大部分功能。
安装mangoDB
cd Software/
#解压
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.6.0.tgz
#配置环境变量
sudo vim ~/.bashrc
#在末尾添加如下内容
export MONGODB_HOME=/home/rock/Software/mongodb-linux-x86_64-ubuntu1604-3.6.0
export PATH=$MONGODB_HOME/bin:$PATH
#刷新环境变量
source ~/.bashrc
#验证环境变量
echo $PATH
启动
1、mongod 启动,需要根目录下存在data/db路径,但是通常用户是没有权限去操作根路径中的文件
2、自己创建数据库的存储位置,在我们拥有权限的文件夹中,创建data/db目录结构
3、启动:
mongod --dbpath /home/rock/data/db
4、注意后面存储的是自己的路径
连接
1、mongo 直接连接
安装图形化
tar -zxvf studio-3t-linux-x64.tar.gz
./ studio-3t-linux-x64.sh
基本操作
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB中常用的几种数据类型:
-
Object ID:文档ID
-
String:字符串,最常用,必须是有效的UTF-8
-
Boolean:存储一个布尔值,true或false
-
Integer:整数可以是32位或64位,这取决于服务器
-
Double:存储浮点值
-
Arrays:数组或列表,多个值存储到一个键
-
Object:用于嵌入式的文档,即一个值为一个文档
-
Null:存储Null值
-
Timestamp:时间戳
-
Date:存储当前日期或时间的UNIX时间格式
数据库操作
> db
test
> use learn
switched to db learn
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> db.student.insert({"name":"daisy"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
learn 0.000GB
local 0.000GB
> db
learn
> db.getName()
learn
> db.student.insert({'eat':'土豆'})
WriteResult({ "nInserted" : 1 })
> db.student.find()
{ "_id" : ObjectId("5b188ff933d2607cbb01596b"), "name" : "daisy" }
{ "_id" : ObjectId("5b18907933d2607cbb01596c"), "eat" : "土豆" }
>
创建数据库:
use 数据库名 有的就是切换,没有就是创建
查看当前数据库:
db
db.getName()
查看所有数据库:
show dbs
删除数据库:
db.dropDatebase()
集合操作
插入一条数据:
db.student.insert({key:value})
db.student.insertone({key:value})
插入多条数据:
db.student.insertMany([{key:value},{key:value}....])
db.student.insertMany([{'name':'zhangsan','age':24},{'name':'lisi','hobby':'MUSIC'}])
大括号代表document,相当于mysql中的row。document中的key:value,key是field,相当于mysql中的column列。
查询
查询所有:
db.student.find()
条件查询:
db.student.find(query,projection)
query 可选,查询条件
projection 可选,字段过滤,默认返回所有字段
字段为0,为不需要返回
字段为1,为需要返回
投射里 除了_id以外,要么全是1,要么全是0,否则就报错
> db.student.find({'name':'lisi'})
{ "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "age" : 18, "hobby" : "sleep" }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "age" : 18, "hobby" : "wangzhe" }
> db.student.find({'name':'lisi'},{'age':1})
{ "_id" : ObjectId("5b1896db33d2607cbb015971") }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
> db.student.find({'name':'lisi'},{'age':0})
{ "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "hobby" : "sleep" }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "hobby" : "wangzhe" }
>
> db.student.find({'name':'lisi'},{'age':1})
{ "_id" : ObjectId("5b1896db33d2607cbb015971") }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
> db.student.find({'name':'lisi'},{'age':0})
{ "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "hobby" : "sleep" }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "hobby" : "wangzhe" }
> db.student.find({'name':'lisi'},{'age':0,'hobby':1})
Error: error: {
"ok" : 0,
"errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
"code" : 2,
"codeName" : "BadValue"
}
> db.student.find({'name':'lisi'},{_id:0})
{ "name" : "lisi", "hobby" : "MUSIC" }
{ "name" : "lisi", "age" : 18, "hobby" : "sleep" }
{ "name" : "lisi", "age" : 18, "hobby" : "wangzhe" }
> db.student.find({'name':'lisi'},{'age':1})
{ "_id" : ObjectId("5b1896db33d2607cbb015971") }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
> db.student.find({'name':'lisi'},{'age':1,_id:0})
{ }
{ "age" : 18 }
{ "age" : 18 }
> db.student.find({'name':'lisi'},{'age':0,_id:0})
{ "name" : "lisi", "hobby" : "MUSIC" }
{ "name" : "lisi", "hobby" : "sleep" }
{ "name" : "lisi", "hobby" : "wangzhe" }
>
操作符
常用操作符query的值
等于 {key:value}
小于 {key:{$lt:value}}
小于等于 {key:{$lte:value}}
大于 {key:{$gt:value}}
大于等于 {key:{$gte:value}}
不等于 {key:{$ne:value}}
> db.person.find({'age':{$gt:8}})
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
>
模糊查询
查询条件的value值,支持正则表达式,实际上是实现的就是关系型数据库中的like
> db.person.find({'name':/.*d.*/})
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
or 和 and
$or:
db.集合名.find({$or : [{key:value},{key:value}]})
多条件or(或)使用,就是查询中使用$or,$or对应的就是列表,方括号里面query条件
> db.person.find({'name':'刘帅','age':20})
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
> db.person.find({$or : [{'name':'daisy'},{'age':20}]})
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
>
limit、skip、sort
sort :排序,1代表升序,-1代表降序
> db.person.find().sort({'age':1})
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
> db.person.find().sort({'age':-1})
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
>
limit ()
> db.person.find().limit(2)
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
skip ():跳过结果集的多少条,分页的第二页就是认为跳过第一页的条数
混合写
当同时使用sort、limit、skip的时候,无论位置先后,都是先sort,再skip,最后limit
> db.person.find().limit(2).sort({'age':1}).skip(1)
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
>
聚合
> db.person.aggregate([{$group:{"_id":null,age_sum:{$sum:"$age"}}}])
{ "_id" : null, "age_sum" : 143 }
使用小窍门:key-value ,value只要不是具体的直接的值,就需要冒号之后使用大括号{}
数据删除
1、数据删除
db.集合名字.deleteOne(query) 删除一条数据,第一条匹配到的数据
db.集合名字.deleteMany(query) 删除所有匹配的数据
> db.person.deleteOne({'name':'刘帅'})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.person.find()
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
> db.person.insert({'name':'刘帅','hobby':'吸烟'})
WriteResult({ "nInserted" : 1 })
> db.person.insert({'name':'刘帅','hobby':'喝酒'})
WriteResult({ "nInserted" : 1 })
> db.person.find()
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
{ "_id" : ObjectId("5b18a67a33d2607cbb015978"), "name" : "刘帅", "hobby" : "吸烟" }
{ "_id" : ObjectId("5b18a68233d2607cbb015979"), "name" : "刘帅", "hobby" : "喝酒" }
> db.person.deleteMany({'name':'刘帅'})
{ "acknowledged" : true, "deletedCount" : 3 }
> db.person.find()
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
>
数据更新
默认只修改第一条文档,如果要修改多条相同的文档,需要设置multi:true
> db.person.update({'name':'daisy'},{$set:{'age':999}})
> db.person.update({'name':'刘帅'},{$set:{'hobby':'tangtou'}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })