数据库mongodb基本操作总结笔记

1. 安装

  • Mac
 brew install mongodb
  • Ubuntu
  sudo apt-get install mongodb

2.启动和关闭

  • 启动

1.服务启动(sudo apt-get install mongodb安装可以)

sudo service mongodb start

2.直接启动(开发阶段使用这种方案启动)

sudo mongod

【注意事项】:

  1. 数据库文件找到引发的错误 Data directory /data/db not found., terminating
sudo mkdir /data
 sudo mkdir /data/db
  1. 权限不够添加sudo
  2. 可能虚拟机的硬盘大小太小了,小到mongodb不允许你启动
sudo mongod --smallfiles
  • 启动参数:
--dbpath 数据库文件路径 默认/data/db

--port 设置监听端口   默认27017

--bind_ip 允许访问的IP地址 

--auth 启动验证模式

--config指定配置文件,把所有的相关配置都放到配置文件中
  • 关闭

1.服务关闭

sudo service mongodb stop

2.直接关闭

# 1. ctrl + C
# 2. 登录到mongodb中退出
    use admin
    db.shutdownServer()
# 3. kill 进程(不推荐使用,特别是线上的数据库)

3 操作基本数据库

利用客户端进行登录

# 服务器启动,
sudo mongod
# 进行客户端登录
mongo

数据库操作

列出数据库

    show dbs/databases

创建数据库

use 数据库
// 插入数据即可创建

删除数据库

use 数据库
db.dropDatabase()

数据表操作(table => collection)

  • 表显示数据库中的集合列
    show collections
  • 创建集合
    // 1. 插入数据即创建
    db.集合名称.insert({"a":"b"})
    // 2. 创建集合不创建数据
    db.createCollection('mycoll')
  • 删除集合
    db.集合名称.drop()
  • 集合重命名
    db.集合名称.renameCollection('新的集合名称')

数据库表中数据操作(collection中数据操作)

    // mongodb内部的脚本是一套 类似于语法 javascript引擎
    // 单条数据插入
    db.mycoll.insert(
        {
            "a":5,
            "b":"abc",
            "c":['q','w','e'],
            "d":{
                "h":"u"
            }
        }
    )
    // 多条数据插入
    data = [
        {"x":"b"},
        {"y":"d"}
    ]
    db.集合名.insertMany(data)

【注意】,默认更新是整体更新,局部更新使用$set,默认更新只更新一条,如果要批量更新就添加第三个参数{multi:true}

// 整体更新
db.stu.update(
    // 更新条件
    {
        "hometown":"蒙古"
    },
    // 更新内容
    {
        "name":"传智播客"
    }
)
// 局部更新
db.stu.update(
    // 更新条件
    {
        "hometown":"桃花岛"
    },
    // 更新内容
    {
        $set:{
            "name":"黑马"
        }
    }
)
// 批量更新
db.stu.update(
    // 更新条件
    {
        "age":18
    },
    // 更新内容
    {
        $set:{
            "name":"python16期"
        }
    },
    // 更新方式
    {
        multi:true
    }
) 
    // 通过删除条件进行删除
    db.stu.remove(
        // 删除条件
        {
            age:18
        },
        // 删除方式
        {
            justOne:true
        }
    )
    // 清空数据
    db.stu.remove({})
  • 保存

按照_id字段进行判定,如果存在就进行更新,如果不存在就插入

db.stu.save(
    {
        "_id":6,
        "a":5,
        "b":7
    }
)

查询的基本语法,默认是并级

// 基本查询
db.stu.find(
    // 设置查询条件
    {
        "age":18,
        "hometown":"蒙古"
    }
)

运算符

  • 比较运算符
## 大于$gt,大于等于$gte,小于$lt,小于等于$lte,不等于$ne

    db.stu.find(
        // 设置查询条件
        {
            "age":{$gt:18}
        }
    )
  • 逻辑运算符

默认是并,或$or

db.stu.find(
    {
        $or:[
            {"age":18},
            {"hometown":"蒙古"}
        ],
        "name":"华筝"
    }
)
  • 范围运算符

$in,$nin,表示内容的值(不)在列表中的查询出来

db.stu.find(
    {
        age:{$nin:[18,45]}
    }
)
  • 支持正则表达式
    // 1. /正则内容/ -> js正则表达式写法
    db.stu.find(
        {
            name:/^黄/
        }
    )
    // 2. 通过正则表达式关键词`$regex`
    db.stu.find(
        {
            name:{$regex:"^黄"}
        }
    )
  • 自定义查询条件
    db.stu.find(
        {
            $where: function(){
                // 返回 true 或者 false,如果是 true 表示符合条件,如果是false表示不符合条件
                // this 表示当前记录对象
                if (this.age > 18 && this.age < 40) {
                    return true
                } else {
                    return false
                }
            }
        }
    )

limit 和 skip

  • limit 显示记录数
  • skip 跳过记录数

【注意】如果skip和limit同时使用,不管谁在前面都是先skip在limit

db.stu.find().limit(1)
db.stu.find().skip(1)

db.stu.find().limit(3).skip(2) == db.stu.find().skip(2).limit(3)

投影

让我们显示需要的字段,只要添加了投影条件就默认字段都不显示,只有设置字段为 1 的才会显示,_id默认都显示,如果想让_id不显示可以设置为0

db.stu.find(
    // 查询条件
    {},
    // 投影-> 显示字段
    {
        name:1,
        "_id":0
    }
)

排序

升序设置为 1,降序设置为-1

db.stu.find().sort(
    // 排序条件
    {
        age:-1
    }
)

统计个数

// 写法一
db.stu.find({查询条件}).count()
// 写法二
db.stu.count({查询条件})

消除重复

关键词distinct()

db.stu.distinct(
    // 去重字段
    'hometown',
    // 过滤条件
    {
        age:{$gt:18}
    }
)

聚合

查询和聚合搜索数据,查询数据更加关注于查询数据本身,聚合关注于统计数据

基本语法

    db.集合名称.aggregate([
         {管道名称 : {表达式}},
         {管道名称 : {表达式}},
         {管道名称 : {表达式}},
         ...
    ])
  • 管道名称
    • $group
    • $match
    • $project
    • $sort
    • $limit
    • $skip
    • $unwind
  • 表达式(进行操作)
    • $sum 统计数量
    • $avg 统计平均年龄
    • $min
    • $max
      -$push 可以把某个字段放到列表中,$$ROOT表示整条数据

管道

group管道

把数据进行分组,分别对组进行表达式操作

    db.stu.aggregate([
         {
             $group : {
                 // 第一参按照哪个字段进行分组 key使用 _id,value编写字段名称必须添加 $
                 // 如果想让所有数据就为一组可以设置成 null
                 _id:null,//"$gender",
                 // 统计表达式
                //  "来自的地区人数":{$sum:1}
                "平均年龄":{$avg:"$age"}
                // "获取最小年龄":{$min:"$age"}
                // "来自地区":{$push:"$hometown"}
                // "数据":{$push:"$$ROOT"}
             }
        }
    ]).pretty()

match管道

       db.stu.aggregate([
           {
               // match 表达式和 查询条件写法一模一样
               $match: {
                   age:{$gt:18}
               }
           },
           {
               $group: {
                   _id:"$hometown",
                   "平均年龄":{$avg:"$age"}
               }
           }
       ])

project 管道

就和查询时投影作用一样,如果需要显示字段就设置 1,

    db.stu.aggregate([
        {
            // match 表达式和 查询条件写法一模一样
            $match: {
                age:{$gt:18}
            }
        },
        {
            $project: {
                // 显示
                age:1,
                name:1,
                hometown:1,
                _id:0
            }
        }
    ])

sort 管道

    db.stu.aggregate([
            {
                // match 表达式和 查询条件写法一模一样
                $match: {
                    age:{$gt:18}
                }
            },
            {
                $group: {
                    _id:"$hometown",
                    "平均年龄":{$avg:"$age"}
                }
            },
            {
                $sort:{
                    "平均年龄":1
                }
            }
        ])

limit 管道 和 skip管道

同时使用,有先后顺序操作,谁先就谁操作

db.stu.aggregate([
    {
        // match 表达式和 查询条件写法一模一样
        $match: {
            age:{$gt:18}
        }
    },{
        $limit:1
    }
])

db.stu.aggregate([
    {
        // match 表达式和 查询条件写法一模一样
        $match: {
            age:{$gt:18}
        }
    },{
        $skip:1
    }
])

db.stu.aggregate([
    {
        // match 表达式和 查询条件写法一模一样
        $match: {
            age:{$gt:18}
        }
    },{
        $limit:2
    },{
        $skip:1
    }
])

unwind 管道

通过某个字段数据拆分,默认情况下如果字段为 空,null,没有字段就会被过滤,如果不想过滤字段就得配置信息

db.t3.aggregate([
    // 字段名称
    {$unwind:'$size'}
])
// 配置不过滤数据
db.t3.aggregate([
    {
        $unwind:{
            // 指定拆分字段
            path:'$size',
            // 如果字段为空null和空就保留下来
            preserveNullAndEmptyArrays:true
        }
    }
])

索引

  • 查看索引
    db.t1.getIndexes()
  • 创建索引
    db.t1.ensureIndex(
        // 建立索引字段名称
        {"name":1},
        // 是否唯一,默认为 false
        {"unique":true}
    )
  • 删除索引
    // 通过获取索引列表查看 name 名称
    db.t1.dropIndex("索引名称")

备份恢复

// 作用导出数据库并且进行压缩
mysqldump -u用户 -p密码 数据库名称 | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz
// 第二步 crontab 定制执行这个脚本

用户验证

启动用户验证

    // 启动方式一
    sudo mongod --auth 
    // 在配置文件中加入 auth=True

创建root账号

当验证模式启动后,如果数据库中没有 root 账号,那么必须先创建 root 账号

    // 进入管理员数据库
    use admin
    // 创建 root账号
    db.createUser(
        {
            "user":"python",
            "pwd":"123456",
            "roles":["root"]
        }
    )
    // 一旦创建 root 账号程序就不允许继续创建

登录

    // 进入管理员数据库
    use admin
    // 登录
    db.auth('用户名','密码')

创建普通账号

// 进入管理员数据库
use admin
// 创建 普通账号
db.createUser(
    {
        "user":"db01",
        "pwd":"123456",
        "roles":[
            {
                // 指定访问数据库名称
                "db":"mydb_01",
                // 指定权限 read,write,readWrite
                "role":"readWrite"
            }
        ]
    }
)
db.createUser(
    {
        "user":"db02",
        "pwd":"123456",
        "roles":[
            {
                // 指定访问数据库名称
                "db":"mydb_02",
                // 指定权限 read,write,readWrite
                "role":"readWrite"
            }
        ]
    }
)

显示当前用户列表

show users

删除用户

// 不推荐使用
db.removeUser('用户名')
// 推荐使用
db.dropUser('用户名')

以上内容仅是代表个人总结 若有错误之处,还请批评指正,欢迎大家一起学习!


版权声明:本文为lbj1260200629原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。