MongoDB简介
- MongoDB是为了快速开发互联网Web应用而设计的数据库系统
- MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分
- MongoDB的数据模型是面向文档的,其文档结构类似于JSON,被称为BSON
Windows下的下载与安装
下载
下载安装包后解压下一步就可以安装了
安装
-
配置环境变量,将MongoDB的bin目录配置到Path环境变量中
-
新建文件夹,在C盘根目录下新增data/db目录
-
启动MongoDB服务器,打开命令行窗口,输入
mongod
命令,启动完成
-
启动MongoDB客户端,不关闭服务端并打开新的命令行窗口,输入命令
mongo
即可打开客户端并连接mongodb
默认情况下,数据存放在C:\data\db中,如果希望数据文件放入其他目录,使用
mongod --dbpath 路径名
命令启动客户端即可默认占用的端口是27017, 如果希望修改占用的端口号,使用命令
mongo --port 端口号
进行修改
将MongoDB设置为系统服务
使用命令太麻烦而又不能关闭窗口,因此希望创建一个MongoDB服务.如果安装的是绿色版本或者低版本,不会自动创建服务,因此需要手动创建
-
指定位置创建一个存放数据的目录,这里使用了
E:\mongodb\data\db
-
指定位置创建一个存放日志的目录并且创建文件xxx.log,这里使用了
E:\mongodb\logs\mongodb.log
-
创建服务
D:\MongoDB\Server\4.0.21> .\bin\mongod.exe --logpath E:\mongodb\logs\mongodb.log --logappend --dbpath E:\mongodb\data\db\ -cd -directoryperdb --bind_ip_all --auth --serviceName MongoDB --install
Linux的下载与安装
- 下载MongoDB压缩包 下载地址
MongoDB前台启动
-
下载好后解压到指定目录,这里解压到/usr/local中
-
创建db目录,用以存放数据,这里在mongodb的跟目录下,创建了data/db
-
启动mongodb服务端
[root@localhost mongodb]# bin/mongod --dbpath data/db/
-
关闭服务
Ctrl + c
MongoDB的后台启动
-
创建一个目录并创建一个日志文件,后台启动时无法打印日志,因此需要将日志存放于日志文件中
mkdir logs touch logs/mongodb.log
这里必须创建一个日志文件,在启动时指定日志文件,MongoDB就会将日志写入到该日志文件中,不能仅仅指定日志目录,因为MongoDB不会创建日志文件
-
后台启动MongoDB
[root@localhost mongodb]# bin/mongod --dbpath data/db/ --logpath logs/mongidb.log --logappend --fork # --dbpath指定数据文件位置 # --logpath指定日志文件位置 # --logappend以追加的形式写日志 # --fork以守护进程的方式启动MongoDB服务端
-
关闭服务,必须指定数据文件位置
[root@localhost mongodb]# bin/mongod --shutdown --dbpath data/db/
MongoDB的配置文件
-
自行创建配置文件,后缀为
.conf
[root@localhost mongodb]# mkdir conf [root@localhost mongodb]# vim conf/mongodb.conf
-
编写配置文件内容
dbpath=/usr/local/mongodb/data/db/ logpath=/usr/local/mongodb/logs/mongodb.log logappend=true bind_ip_all=true port=27017 fork=true
-
使用
-f
或--config
指定配置文件,启动MongoDB服务端[root@localhost mongodb]# bin/mongod -f conf/mongodb.conf
客户端连接
[root@localhost mongodb]# bin/mongo
# 默认情况下连接127.0.0.1的27017端口,可以使用--host和--port选项指定主机和端口
[root@localhost mongodb]# bin/mongo --host 192.158.56.11 --port 27017
在客户端中关闭服务端
# 进入admin库
use admin;
# 调用关闭服务端方法
db.shutdownServer();
用户与权限管理
常用权限
权限名 | 描述 |
---|---|
read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除, 查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合中写入,可以在指定数据库中创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关的函数管理权限 |
readAnyDatabse | 只在admin数据库中可用, 赋予用户所有数据库的读权限 |
readWriteDatabse | 只在admin数据库中可用, 赋予用户所有数据库的读写权限 |
userAdminDatabse | 只在admin数据库中可用, 赋予用户所有数据库的userAdmin权限 |
dbAdminDatabse | 只在admin数据库中可用, 赋予用户所有数据库的dbAdmin权限 |
root | 只在admin数据库中可用, 超级权限, 包含所有权限 |
创建用户并使用
-
进入到admin库中创建root用户
use admin; db.createUser({ "user":"root","pwd":"root","roles":[{ "role":"root", "db":"admin"}],"customData":{ "infomation":"first mongodb user"} });
-
修改配置conf/mongodb.conf文件,添加认证参数
-
重启mongod服务
-
连接并认证
# 连接服务端,连接会成功但是什么都做不了,需要进行认证 [root@localhost mongodb]# bin/mongo # 进入admin库 > use admin # 认证 > db.auth("root", "root");
修改用户
修改用户任意信息
> use admin
> db.updateUser("guest", {
"pwd":"123", "roles":[{
"role":"readWriteAnyDatabase", "db":"admin"}]});
修改用户密码
> use admin
> db.changeUserPassword("root", "123");
删除用户
> use admin
> db.dropUser("guest");
数据库管理
查看数据库
> show dbs;
# 或
> show databases;
创建数据库
> use test; # 此时已经创建了数据库,但是由于没有写入数据,尚未创建对应文件,因此当查看数据库时并不会显示出来,当写入数据后就会查看到该数据库
# 写入数据
> db.abc.insert({
"a":"123"});
删除数据库
> use test;
> db.dropDatabase();
进入那个库就是删除那个库,调用方法时不需要传递参数
集合操作
查看集合
> show tables;
# 或
> show collections;
创建集合
方法一: 进入到指定数据库中,使用db.createCollection创建
> use test
> db.createCollection("集合名");
创建时给集合设置约束
> db.createCollection("ego_item_decs", {
"capped":true, "size":20000, "max":100, "autoIndexId":true});
# capped 容量限制,默认为fasle(不限制该集合大小)
# size 容量大小,单位字节 (capped打开才能设置)
# max 对象个数(capped打开才能设置)
# autoindexid 给_id字段自动创建索引(默认为true), 该参数即将过时
方法二: 直接向不存在的集合插入数据,即可自动创建集合
> use test
> db.ego_items.insert({
"title":"Hello MongoDB", "price":9900, "num":999});
查看集合详情
> db.集合名.stats();
删除集合
> db.ego_item_decs.drop();
文档管理
新增数据
新增单个文档
> db.集合名.insert({
"name":"zhangsan", "pswd":"123", "age":"20"});
# 或
> db.集合名.save({
"name":"lisi", "pswd":"123", "age":25});
insert与save的区别:
insert为新增. save为保存可能会出现覆盖
3.0版本以后推荐使用下述方式新增文档
> db.集合名.insertOne({
"name":"wangwu", "pswd":"123", "age":21});
insertOne只能插入一行数据,可以生成一个OnjectId作为_id
新增多个文档
> db.集合名.insert([{
}, {
}]);
# 或
> db.集合名.save([{
}, {
}]);
# 或
> db.集合名.insertMany([{
}, {
}]);
变量定义与使用
变量定义
> 变量名=({
"name":"var", "pswd":"3423", "age":50})
变量定义后,即可在和变量结构相同的地方使用它
查询数据
查询所有数据
> db.集合名.find();
条件查询
等于
> db.集合名.find({
"name":"lei"});
不等于
查询age小于22的文档
> db.集合名.find({
"age":{
"$lt":22}});
小于: $lt
大于: $gt
小于等于: $lte
大于等于: $gte
不等于: $ne
多条件查询
AND查询
查询年龄大于等于20小于30的人
> db.ego_users.find({
"age":{
"$lt":30, "$gte":20}});
查询姓名为zhangsan并且年龄大于等于20小于30的人
> db.ego_users.find({
"name":"zhangsan", "age":{
"$lt":30, "$gte":20}});
OR查询
查询姓名为zhangsan或者年龄小于23的人
# db.集合名.find({"$or":[{条件}, {条件}]})
> db.ego_users.find({
"$or":[{
"name":"zhangsan"}, {
"age":{
"$lt":23}}]})
查询第一个数据
> db.集合名.findOne();
findOne也可以进行条件查询,返回匹配条件的第一个数据
投影约束
投影约束就是查询某个字段的值而不是查询所有字段
> db.集合名.find({
}, {
"name":0})
0代表查询不包含该字段的数据,1代表仅查询该字段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHn3S4pw-1607406561914)(E:\notebook\MongoDB.assets\image-20201126105747366.png)]
还可以进行多个字段的查询
> db.ego_users.find({}, {"name":1, "age":1})
进行多字段投影约束查询的时候有如下要求
- 查询时字段要么全为1,要么全为0,不可以同时存在0和1,如db.ego_users.find({}, {“name”:0, “age”:1})
- 有_id字段时,当_id字段为0,其他字段可以为0,也可以为1,当_id字段为1时,其他字段必须为1
查询结果格式化
在查询函数后调用pretty()函数
> db.ego_users.find().pretty(</