【学习笔记】MongoDB详细教程

这篇博客详细介绍了MongoDB的安装、配置、用户权限管理、数据库与集合操作、文档管理、查询与更新技巧、聚合查询以及在Spring Data MongoDB中的应用。包括MongoDB在Windows和Linux上的安装步骤,用户权限的创建、修改和删除,数据的增删查改,以及索引管理和Spring Data MongoDB的使用等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

MongoDB简介

  • MongoDB是为了快速开发互联网Web应用而设计的数据库系统
  • MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分
  • MongoDB的数据模型是面向文档的,其文档结构类似于JSON,被称为BSON

Windows下的下载与安装

下载

MongoDB下载地址

下载安装包后解压下一步就可以安装了

安装

  1. 配置环境变量,将MongoDB的bin目录配置到Path环境变量中

  2. 新建文件夹,在C盘根目录下新增data/db目录

  3. 启动MongoDB服务器,打开命令行窗口,输入mongod命令,启动完成

在这里插入图片描述

  1. 启动MongoDB客户端,不关闭服务端并打开新的命令行窗口,输入命令mongo即可打开客户端并连接mongodb
    在这里插入图片描述

    默认情况下,数据存放在C:\data\db中,如果希望数据文件放入其他目录,使用mongod --dbpath 路径名命令启动客户端即可

    默认占用的端口是27017, 如果希望修改占用的端口号,使用命令mongo --port 端口号进行修改

将MongoDB设置为系统服务

使用命令太麻烦而又不能关闭窗口,因此希望创建一个MongoDB服务.如果安装的是绿色版本或者低版本,不会自动创建服务,因此需要手动创建

  1. 指定位置创建一个存放数据的目录,这里使用了E:\mongodb\data\db

  2. 指定位置创建一个存放日志的目录并且创建文件xxx.log,这里使用了E:\mongodb\logs\mongodb.log

  3. 创建服务

    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的下载与安装

  1. 下载MongoDB压缩包 下载地址
    在这里插入图片描述

MongoDB前台启动

  1. 下载好后解压到指定目录,这里解压到/usr/local中

  2. 创建db目录,用以存放数据,这里在mongodb的跟目录下,创建了data/db

  3. 启动mongodb服务端

    [root@localhost mongodb]# bin/mongod --dbpath data/db/
    
  4. 关闭服务Ctrl + c

MongoDB的后台启动

  1. 创建一个目录并创建一个日志文件,后台启动时无法打印日志,因此需要将日志存放于日志文件中

    mkdir logs
    touch logs/mongodb.log
    

    这里必须创建一个日志文件,在启动时指定日志文件,MongoDB就会将日志写入到该日志文件中,不能仅仅指定日志目录,因为MongoDB不会创建日志文件

  2. 后台启动MongoDB

    [root@localhost mongodb]# bin/mongod --dbpath data/db/ --logpath logs/mongidb.log --logappend --fork
    
    # --dbpath指定数据文件位置
    # --logpath指定日志文件位置
    # --logappend以追加的形式写日志
    # --fork以守护进程的方式启动MongoDB服务端
    
  3. 关闭服务,必须指定数据文件位置

    [root@localhost mongodb]# bin/mongod --shutdown --dbpath data/db/
    

MongoDB的配置文件

  1. 自行创建配置文件,后缀为.conf

    [root@localhost mongodb]# mkdir conf
    [root@localhost mongodb]# vim conf/mongodb.conf
    
  2. 编写配置文件内容

    dbpath=/usr/local/mongodb/data/db/
    logpath=/usr/local/mongodb/logs/mongodb.log
    logappend=true
    bind_ip_all=true
    port=27017
    fork=true
    
  3. 使用-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数据库中可用, 超级权限, 包含所有权限

创建用户并使用

  1. 进入到admin库中创建root用户

    use admin;
    
    db.createUser({
         "user":"root","pwd":"root","roles":[{
         "role":"root", "db":"admin"}],"customData":{
         "infomation":"first mongodb user"}
    });
    
  2. 修改配置conf/mongodb.conf文件,添加认证参数
    在这里插入图片描述

  3. 重启mongod服务

  4. 连接并认证

    # 连接服务端,连接会成功但是什么都做不了,需要进行认证
    [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(</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值