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用户
- 输入mongo 进入mongodb环境
- 切换到admin :use admin
- 创建root用户:db.createUser({user: 'root', pwd: 'thy123', roles: ['root']})
- 完成后退出mongo:quit()
- 再次进入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 可以使用的选项) |
|---|---|---|
| capped | Boolean | (可选)如果为 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然后再调用其他。