MongoDB基础语法
概念碰撞
SQL概念 | Mongo概念 | 实际意思 |
---|---|---|
database | database | 数据库 |
table | collection | 就是一类数据的集合 |
row | document | 一条数据 |
column | field | 某一条数据的某一个属性名 |
index | index | 索引 |
primary key | primary key | 主键,mongo 会自动创建_id 作为document 的主键 |
数据类型
Mongodb
支持很多种数据类型
类型 | 描述 |
---|---|
String | 字符串类型 |
Integer | 整数 |
Float | 单精度浮点数 |
Double | 双精度浮点数 |
Boolean | 布尔 |
Array | 数组 |
TimeStamp | 时间戳 |
Object | 内嵌文档 |
Date | 日期 |
Object ID | 对象id |
BinaryData | 二进制数据 |
基础语法
创建数据库
# 切换数据库,如果没有则创建
use database_name
这时候查看一下所有数据库,发现并没有出现zhima
数据库,这是因为这个数据库还在内存中,没有落盘
创建集合
# 创建study集合
db.createCollection('study')
这个时候再看下所有数据库,就会发现zhima
数据库了
删除集合
# 删除study集合
db.study.drop()
删除数据库
# 删除当前所在数据库
# 删除之前可以先执行以下命令确保你删除的是你要删除的数据库
# use 你要删除的数据库名
dp.dropDatabase()
CUD
想要对document
进行CRUD,首先要创建数据库,接着创建集合,然后才能操作document
不是
# 创建zhima数据库
use zhima
# 创建student集合
db.createCollection('student')
我们首先明确student
有哪些属性
属性名 | 类型 | 含义 |
---|---|---|
id | Object ID | 主键 |
name | String | 姓名 |
age | Integer | 年龄 |
birthday | Date | 生日 |
hobbies | Array | 兴趣爱好 |
Create
用以下语句创建一个学生
db.student.insert({
name:'kerwin',
age: 22,
birthday: '2002-05-22',
hobbies: ['coding','music','badminton']
})
这里先介绍一下最简单的一条用于查询的语句,不然我怎么知道我插入成没成功啊
db.student.find()
Update
下面修改一下kerwin
同学的姓名
db.student.update(
{
_id:ObjectId("64d1ee8455ce8759d8deb95c")
},
{
name: 'zhima'
}
)
查询后发现原本的属性都不见了,这种更新叫全量更新
如果只想修改姓名这一个字段的属性就需要用以下语法
db.student.update(
// 指定要更新哪些符合要求的document
{
_id:ObjectId("64d1f04755ce8759d8deb95d")
},
// 定义更新规则
{
$set:
{
name:"zhima"
},
$inc:
{
age:1
}
}
)
Delete
删除符合要求的document
db.student.remove({name:"zhima"})
Retrieve
重头戏了,要知道,CUD都玩不出什么花样来
在SQL
里面可是把CUD操作并到了DML
语句中,而查询语句可是单独叫DQL
语句,可见他有多么重要
查询全部
查询集合中所有的文档(document),这个之前就看过了
db.student.find()
默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据
去重查询
查询去重后的数据
db.student.distinct("name")
按条件查询
查询指定条件的数据
db.student.find({_id:ObjectId("64d1f26255ce8759d8deb971")})
查询年龄在23到24之间,并且姓名是Kerwin的学生记录
db.student.find({
age:{
$gte:23,
$lte:24
},
name: "kerwin"
})
符号 | 含义 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$eq | 等于 |
模糊查询
mongodb不仅支持简单的模糊查询,还支持强大的正则表达式,语法很简单
// 正则表达式用\\包裹
// 查询姓名是k开头的l结尾的,并且指定返回的字段_id和name
db.student.find(
{
name:"\^k.*l$\"
},
{
_id:1,
name:1
}
)
排序
按照指定字段排序后返回结果集
// 查询所有年龄大于23的学生,按照_id升序,age降序返回
db.student(
{
age: {
$gte:23
}
}
).sort({
_id:1,
age:-1
})
分页查询
一页的数据是5条
查询第一页数据
db.student.find().skip(0).limit(5)
查询第二页数据
db.student.find().skip(5).limit(5)
or查询
查询年龄大于等于23或者小于15的
db.student.find({
$or: [
{age: {$gte:23}},
{age: {$lte:15}}
]
})
索引
建立索引后可以很大程度的提高查询的效率
// 查看集合上的所有索引
db.student.getIndexes()
db.student.getIndexes()
db.student.reIndex()
// 删除指定索引
db.student.dropIndex("indexName")
// 删除所有索引
db.student.dropIndexes()
创建索引
// 建立联合索引,按照name升序,age降序
db.student.ensureIndex({name:1,age:-1})
用户
现在我们启动的mongodb是没有认证的,所有人都可以连接
为了安全,需要创建用户指定这个用户的登录名和密码,并且指定他有哪些库的哪些权限
MongoDB采用的是RBAC(Resource/Role Based Access Control),基于资源/角色的访问控制
每个用户有多个角色,一个角色具有多个操作资源的权限,从而达到了权限控制的目的
内置角色
mongodb提供了很多内置角色
有的角色只有admin
库拥有
用户自己创建的数据库内置的角色只有以下这些
{
"role" : "readWrite",
"db" : "zhima",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
},
{
"role" : "dbOwner",
"db" : "zhima",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
},
{
"role" : "userAdmin",
"db" : "zhima",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
},
{
"role" : "enableSharding",
"db" : "zhima",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
},
{
"role" : "read",
"db" : "zhima",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
},
{
"role" : "dbAdmin",
"db" : "zhima",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
创建用户
拥有admin
库的userAdminAnyDatabase
角色的用户
use admin;
db.createUser({
user: "admin",
pwd: "admin",
roles: [
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
})
拥有不受任何限制的用户
use admin;
db.createUser({
user: "superuser",
pwd: "supreuser",
customData:{
description: "superuser"
},
roles: ["root"]
})
创建一个只能操作部分库的用户
use zhima;
db.createUser({
user: "user001",
pwd: "user001",
customData:{
name:'oridinary user'
},
roles:[
{role:"readWrite",db:"db001"},
{role:"readWrite",db:"db002"},
'read'// 对其他数据库有只读权限
]
})
修改密码
db.changeUserPassword("user001","1234")
认证
db.auth("user001","1234")
查看当前登录用户
> db.runCommand({connectionStatus:1})
{
"authInfo" : {
"authenticatedUsers" : [
{
"user" : "user001",
"db" : "zhima"
}
],
"authenticatedUserRoles" : [
{
"role" : "readWrite",
"db" : "zhima"
}
]
},
"ok" : 1
}
mongodb启动的时候默认是关闭认证的,需要在启动的时候开启认证的选项
mongd --dbpath=..\data --auth