MongoDB手册

1. 用户管理

角色 描述 数据库
read 数据库读取权限 *
readWrite 数据库读写权限 *
dbAdmin 执行管理函数权限 *
userAdmin 执行用户管理权限 *
clusterAdmin 所有分片和复制集相关函数的管理权限 admin
readAnyDatabase 所有数据库的读取权限 admin
readWriteAnyDatabase 所有数据库的读写权限 admin
userAdminAnyDatabase 所有数据库的userAdmin权限 admin
dbAdminAnyDatabase 所有数据库的dbAdmin权限 admin
root 超级权限 admin
# 创建用户
db.createUser({user: "root", pwd: "root", roles:[{role:"root", db:"admin"}]})
# 查询用户
db.system.users.find()

开启数据库安全认证

security:
  authorization: enabled
# 认证用户
db.auth("root", "root")
# 更新用户
db.updateUser("root", {pwd: "123456"})
# 更改用户密码
db.changeUserPassword("root", "123456")
# 删除用户
db.dropUser("root")

2. 数据库管理

# 创建/切换数据库
use test
# 查询所有数据库
show databases
# 删除数据库(需要先切换到要删除的数据库)
db.dropDatabase()

3. 集合管理

# 创建集合
db.createCollection("col1")
# 查看集合
show collections/tables
# 删除集合
db.col1.drop()

4. 文档管理

# 创建文档
db.col1.insertMany([
    {"name": "test", "value": "test"},
    {"name": "test", "value": "test"
])
# 新增单个文档
db.col1.insertOne({"name": "test", "value": "test"})

save()insert()都可用于创建文档, save()还可用于更新文档

集合col1文档内容

{ "_id" : ObjectId("603eef2fd702dd13f81d99de"), "name" : "calong", "age" : 19, "sex" : "M" }
{ "_id" : ObjectId("603eef3ed702dd13f81d99df"), "name" : "sarach", "age" : 18, "sex" : "W" }
{ "_id" : ObjectId("60404c486c5e206a4273fc9c"), "name" : "keras", "age" : 21, "sex" : "M" }
{ "_id" : ObjectId("60404c576c5e206a4273fc9d"), "name" : "Jiawen", "age" : 22, "sex" : "M" }
条件操作符 含义 语法
$gt/$gte 大于/大于等于 {键:{$gt/$gte:值}}
$lt/$lte 小于/小于等于 {键:{$lt/$lte:值}}
$eq/$ne 等于/不等于 {键:{$eq/$ne:值}}
$and 且连接 {$and:[{条件}, {条件}]}
$or 或连接 {$or:[{条件}, {条件}]}
$in/$nin 包含 {键:{$in/$nin:[值, 值]}}
$type 类型判断符 {键:{$type:值}}
# 查询所有文档
db.col1.find()
# 按条件查询
db.col1.find({name: "calong"})
# 查询指定属性
db.col1.find({}, {_id: 0, name:1, age:1})
# 查询符合条件的指定属性
db.col1.find({name: "calong"}, {_id:0, name:1, age:1})
# 正则查询
db.col1.find({name: /^Jia/})
# 条件操作符
db.col1.find({age:{$gt:20}})

# 覆盖文档
db.col1.update({name: "calong"}, {name: "calong", age: 21, sex: "M"})
# 更新指定属性(没有则创建)
db.col1.update({name: "calong"}, {$set:{grade: 97}})
# $inc操作符
db.col1.update({name: "calong"}, {$inc:{grade: 1}})
# 删除文档指定属性
db.col1.update({name: "calong"}, {$unset:{grade: 1}})

# 数组操作
# 向数组中添加值(没有则创建)
db.col1.update({name: "calong"}, {$push:{class:"Java"}})
# 从数组尾部(1)或头部(-1)删除一个值
db.col1.update({name: "calong"}, {$pop:{class:1}})
# 从数组中删除指定的单个值
db.col1.update({name: "calong"}, {$pull:{class:"Java"}})
# 从数组中删除指定的多个值
db.col1.update({name: "calong"}, {$pullAll:{class:["Java"]}})

# 重命名属性
db.col1.update({name: "calong"}, {$rename:{class:"subject"}})

# 从符合条件的文档中删除一个
db.col1.deleteOne({name: "Jiawen"})
# 删除所有符合条件的文档
db.col1.deleteMany({name: "Jiawen"})

remove()也可以用于删除文档

# 分页查询(skip表示跳过几个, limit表示查询几个)
db.col1.find().limit(2).skip(1)
# 排序查询(1表示升序, -1表示降序)
db.col1.find().sort({name:1})

5. 聚合函数

# group表示分组(_id的值表示分组字段)
# 求总条数
db.col1.aggregate([{$group: {_id: null, count: {$sum: 1}}}])
# 求和
db.col1.aggregate([{$group: {_id: null, sum: {$sum: "$age"}}}])
# 筛选(match在group之前表示分组前筛选, 在group之后表示分组时候筛选)
db.col1.aggregate([{$match: {name: /a/}}, {$group: {_id: null, sum: {$sum: "$age"}}}])
db.col1.aggregate([{$group: {_id: null, sum: {$sum: "$age"}}}, {$match: {name: /a/}}])
# 最大值
db.col1.aggregate([{$group: {_id: null, max: {$max: "$age"}}}])
# 最小值
db.col1.aggregate([{$group: {_id: null, min: {$min: "$age"}}}])
# 平均值
db.col1.aggregate([{$group: {_id: null, avg: {$avg: "$age"}}}])
# 分组并返回分组统计的数据
db.col1.aggregate([{$group: {_id: "$age", count: {$sum: 1}, names: {$push: "$name"}}}])

当前数据

{ "_id" : ObjectId("603eef2fd702dd13f81d99de"), "name" : "calong", "age" : 21, "sex" : "M", "subject" : [ "Python", "Golang" ] }
{ "_id" : ObjectId("603eef3ed702dd13f81d99df"), "name" : "sarach", "age" : 18, "sex" : "W", "subject" : [ "Golang", "C++" ] }
{ "_id" : ObjectId("60404c486c5e206a4273fc9c"), "name" : "keras", "age" : 21, "sex" : "M", "subject" : [ "JavaScript", "Rust" ] }
# 数组字段拆分
db.col1.aggregate({$unwind: "$subject"})

6. 索引管理

参数 含义
background 后台运行创建过程 true/false
unique 是否为唯一索引(唯一索引的字段不能包含重复的值) true/false
name 索引名称 “index_name”
sparse 只对文档中存在的字段启用索引(稀疏索引) true/false
expireAfterSeconds 集合的生存时间TTL 100
partialFilterExpression 部分索引 {partialFilterExpression:{条件:{字段:值}}}
# 创建索引(1表示升序, -1表示降序)
db.col1.createIndex({name: 1}, {background: true})
# 查看索引
db.col1.getIndexes()
# 查看创建索引的键
db.col1.getIndexKeys()
# 查看索引大小(不加参数表示显示总大小)
db.col1.totalIndexSize([1])
# 删除指定索引
db.col1.dropIndex("name_1")
# 删除所有索引(除主键之外)
db.col1.dropIndexes()
# 重建索引
db.col1.reIndex()

索引类型包括:

  1. 单字段索引
  2. 交叉索引: 为一个集合的多个字段分别建立索引(多个单字段索引)
  3. 复合索引: 对多个字段联合创建索引
  4. 多KEY索引: 数组类型的索引
# 查询执行计划
db.col1.find().explain()
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!