MongoDB学习笔记

155 阅读4分钟

MongoDB

中文文档

MongoDB中文手册|官方文档中文版 - MongoDB-CN-Manual (mongoing.com)

安装

Windows10

mongoDB 4.2最稳定版本安装 - 知乎 (zhihu.com)

mongo 启动客户端

mongod [(可选参数) --dbpath db路径(默认c:/data) --port 端口号(默认27017)] 启动服务器

开机自启:

参考:(57条消息) mongoDB设置开机自动启动(亲测)m0_62861375的博客-CSDN博客mongodb设置开机自动启动

1.在MongoDB的data文件下创建一个db文件夹和一个log文件夹,之后再在log文件夹内创建一个mongodb.log文件

2.在MongoDB文件夹下创建一个mongod.cfg文件,以记事本方式打开,输入如下代码(注意开头有空格,记得粘贴完全,这里要根据自动下载路径改一下),然后保存关闭

systemLog:
    destination: file
    path: D:\mongodb\log\mongod.log
storage:
    dbPath: D:\mongodb\data\db

3.管理员权限执行cmd,运行:

sc.exe create MongoDB binPath= ""D:\mongodb\bin\mongod.exe" --service --config="D:\mongodb\mongod.cfg"" DisplayName= "MongoDB" start= "auto"

4.删除D:\mongodb\data\db路径下的mongod.lock与storage.bson文件

5.右键我的电脑,点击管理,然后进去找到服务,打开找到MongoDB,启动MongoDB

Linux

version:4.2稳定版

创建yum文件

vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

执行

yum install -y mongodb-org

修改配置文件对应ip 0.0.0.0

vim /etc/mongod.conf

基本使用

启动:service mongod start

停止:service mongod stop

重启:service mongod restart

设置开机自启动:systemctl enable mongod

查看服务是否启动:systemctl status mongod

查看mongoDB日志:

cat /var/log/mongodb/mongod.log 

安全设置

创建root用户

  1. 输入mongo 进入mongodb环境
  2. 切换到admin :use admin
  3. 创建root用户:db.createUser({user: 'root', pwd: 'thy123', roles: ['root']})
  4. 完成后退出mongo:quit()
  5. 再次进入mongo环境, 选择admin库,查看是否可以登录:db.auth('root','xxxxxxxxxxx') 返回1就是登录成功。

给具体库添加用户,并且授予权限

(mongodb的逻辑是:库可以添加用户,并给予这个用户特定的权限,这样就可以以这个用户的身份进行权限内的使用)

example:给admin库添加一个用户root,并赋予所有权限

use admin
db.createUser({ user: 'admin', pwd: 'xxxxxxxxx', roles: [{ role: 'root', db: 'admin' }] })

这里的role: 'root' 意思是给这个用户的角色是root角色,对应这个admin库的所有权限。和我们上面说的root用户没任何关系

这里的权限包括:

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

注意:这时,以上的安全设置到目前为止还没有生效,需要到配置文件中开启安全认证。

开启安全认证

vi /etc/mongod.conf 找到“#security:”项,开启并在其下方添加:

security:
 authorization: enabled

重启mongodb(没重启就不生效):service mongod restart

要建立其他的库,也相应地给他加上用户和权限

关于删除用户

进入mongo环境,use admin

登录root账号 db.auth('root','xxxx')

执行删除admin用户:db.dropUser('admin') 返回true即可

也可以执行删除所有的用户:db.dropAllUser() 删除当前库的所有用户

卸载

1、停止服务 service mongod stop

2、删除安装的包 yum erase $(rpm -qa | grep mongodb-org)

3、删除数据及日志 rm -r /var/log/mongodb rm -r /var/lib/mongo

最彻底的删除mongodb可以参考这个文章: blog.csdn.net/qq_31973461…

更改用户密码的参考文章: (57条消息) 修改MongoDB密码_weixin_30832983的博客-CSDN博客

注意: 如果端口不是27017 ,那么,开启mongod的命令是: mongod --port 27xxxx -f /etc/mongod.conf 在终端进入 mongo的命令是: mongo --port 27xxx

基本概念

mongodb用的BSON:BSON对JSON做了哪些改进? (biancheng.net)

  • 数据库database

    • 可以有多个数据库,数据库里面存放集合

    • 默认有三个

      admin 0.000GB config 0.000GB local 0.000GB

  • 集合collection(mysql的table)(操作的时候如果集合不存在会直接创建)

    • 类似于数组,存放文档
  • 文档document(table的每行数据)

    • 文档数据库的最小单位,存储和操作的内容都是文档

    • 文档间关系

      • 一对一:用户-id,可以用内嵌文档的形式体现{xxx}
      • 一对多(多对一):用户-订单、文章-评论 ,用内嵌文档的形式体现{[xx,xx...]}或者加个字段,类似mysql的外键
      • 多对多:分类-商品、老师-学生,类似
  • 索引index

    • MongoDB 的索引是基于 B-tree 数据结构及对应算法形成的。树索引存储特定字段或字段集的值,按字段值排序。索引条目的排序支持有效的等式匹配和基于范围的查询操作。

    • 索引类型

      • 单键索引
      • 复合索引
      • 多键值索引
      • 地理索引
      • 全文索引
      • 散列索引

在MongoDB中,数据库和集合都不需要我们手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在,系统会自动创建数据库和集合(隐式创建),也可用db.createCollection(name, options)显示创建集合。

参数类型描述(options 可以使用的选项)
cappedBoolean(可选)如果为 true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大时自动覆盖其最旧的条目。如果指定 true,则还需要指定 size 参数
size数字(可选)指定上限集合的最大大小(以字节为单位)。如果 capped 为 true,那么还需要指定次字段的值
max数字(可选)指定上限集合中允许的最大文档数

注意:在插入文档时,MongoDB 首先检查上限集合 capped 字段的大小,然后检查 max 字段。

命名规则

集合命名规则:

  • 符合 UTF-8 标准的字符串
  • 集合名不能是空串
  • 不能含有空字符 \0
  • 不能以“system.”开头,这是系统集合保留的前缀
  • 集合名不能含保留字符“$”

键的命名规则:

  • 不能包含\0字符(空字符),因为这个字符表示键的结束;
  • 不能包含$.,因为.$是被保留的,只能在特定环境下使用;
  • 键名区分大小写;
  • 键的值区分类型(如字符串和整数等);
  • 键不能重复,在一条文档里起唯一的作用

命令

基本操作

show databases(show dbs):显示当前所有数据库

use 数据库名:进入指定数据库【可以不存在】

db:显示当前所在数据库

show collections:显示当前数据库中所有集合

crud操作

MongoDB中的所有写操作都是单个文档级别的原子操作。有关MongoDB和原子性的更多信息,请参见原子性和事务。 MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这个文档为内嵌文档。

  • 插入文档 - MongoDB-CN-Manual (mongoing.com)

    • db.集合名.insert()

      • 插入一个对象:db.集合名.insert(doc)

        db.students.insert({name:"thy",age:18,sex:"男"})

      • 插入多个对象:db.集合名.insert([doc1,doc2,....])

    • 3.2版本增加了db.集合名.insertOne() 和 db.集合名.insertMany()方法,就是为了让语义表达更明确

      • insertOne(doc)返回一个文档,包含新插入的文档的_id字段值
      • insertMany([doc1,doc2...])
    1.当我们向集合中插入文档时,如果没有给文档指定 _id 属性,则数据库会自动给文档添加 _id,该属性用来作为文档的唯一标识
    2._id可以自己指定,如果我们指定了,数据库就不会再添加了,如果自己指定 _id必须也确保唯一性(一般让数据库自己生成)
    
  • 查询文档 - MongoDB-CN-Manual (mongoing.com)

    • db.集合名.find()

      • 查询集合中所有文档(或者传入空对象{})

      • db.集合名.find({field1:value1,...}) 相当于sql中where

        • db.x.find({},{field1:1}) 显示符合条件的field列 相当于select id,filed from x;默认都会显示id,可以用db.x.find({},{field1:1,_id:0})来取消显示id【1显示,0不显示,默认都显示】
      • find返回的是一个数组,所有可以通过下标取值:db.集合名.find({field1:value1,...})[0]

    • db.集合名.findOne()

      • 查询集合中符合条件的第一个文档
      • 返回的是一个文档
    • db.集合名.find().count()

      • 查询find语句返回结果的数量
    • db.集合名.find().length()

      • 返回结果与count()一样,还没有细看与count区别
    • db.集合名.update(查询条件,新对象)

      • 默认情况下会使用新对象来替换旧对象(整个替换)

      • 如果需要修改指定属性,使用修改操作符【下面只列出一部分】

        • $set:可以用来修改文档中的指定属性(update默认只修改一个符合条件的,要改多个用updateMany或者启用multi选项)

          修改name为thy1的文档,将其name改为thy2
          db.test.update(
              {name:"thy1"},
              {$set:{
                  name:"thy2"
              }},
              //其实还有第三个参数,是一些配置
              {
                  upsert:bool,
                  multi:bool,
                  writeConcern:document,
                  collation:document
              }
          )
          
        • $unset:可以用来删除文档中的指定属性

    • 同理也有updateOne()和updateMany() 参考上面insert

    • db.集合名.replaceOne():替换一个符合条件的文档

    • remove()

      • db.x.remove({}) 清空数据库 (性能不行 与mysql的delete一样 是一个一个删的)

        可以直接用db.x.drop()删除集合 类似于mysql的drop

        db.dropDatabase() 删除数据库

      • db.x.remove({name:"thy"})默认删除多个符合条件的

      • 第二个参数传入true 就只会删除一个符合条件的 db.x.remove({age:10,true})

    • deleteOne()

    • deleteMany()

      • 传入{}会删除所有
    • 一般不会真删,数据is money,剩余一般是加一个字段判断数据是否删除,类似gorm的delete

排序

查询时默认情况是按照_id的值进行排序(升序)

sort()函数可以用来指定文档的排序规则,sort()需要传递一个对象来指定排序规则(1升序 -1降序)

db.students.find().sort({grade:-1,id:1}) 先按成绩降序排序,成绩相同则按照id升序排序

limit skip sort可以任意顺序进行调用,系统自己会默认先调用sort然后再调用其他。