MongoDB数据库操作及操作命令

news2024/10/5 12:45:51

目录

一、基础概念

二、安装mongod

 三、命令交互数据库

(1)数据库命令

(2)集合命令

(3)文档命令

 四、Mongoose

(1)增加一条数据

(2)插入多个数据 

(3)删除一条数据

(4)删除多个数据

(5)更新数据

(6)更新多条数据

(7)读取条件某一条数据

(8)根据id读取某一条数据

(9)读取多个数据

(10)根据查询条件读取

(11)个性化读取

(12)开发常见的操作

五、图形化管理


一、基础概念

Mongodb 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/
数据库的主要作用就是用来管理数据,能够达到增删改查的作用,语法也和JavaScript相似。
在使用数据库之前要了解三个概念
(1)数据库:是一个数据仓库,例如一个数据库下有很多个集合(也可以理解成多个表)
(2)集合:表,在JavaScript的提现形式 可以理解为 数组 [ { id:2 ,name:ultraman } ]
(3)文档:就可以理解成一条数据了 在JavaScript的提现形式 可以理解为 { id:2 ,name:ultraman }
用js代码举个例子:
{
    "users": [
        {
            "id": 1,
            "name": "张三",
            "age": 18,
        },
        {
            "id": 2,
            "name": "李四",
            "age": 20,
        },
    ],
    "articles": [
        {
            "id": 1,
            "title": "标题1",
            "content": "内容1",
        },
        {
            "id": 2,
            "title": "标题2",
            "content": "内容2",
        },
    ],

}

在代码中 整个对象就是一个数据库(JSON文件) 里面包含着两个集合(表) 一个用户表和一个文章表 文档就可以理解成某条表中的数据。

当然也可以有多个数据库,一般情况下一个项目使用一个数据库

二、安装mongod

下载地址: https://www.mongodb.com/try/download/community
建议选择 zip 类型, 通用性更强
配置步骤如下:
  1. 将压缩包移动到 C:\Program Files 下,然后解压
  2. 创建 C:\data\db 目录,mongodb 会将数据默认保存在这个文件夹
  3. mongodb bin 目录作为工作目录,启动命令行
  4. 运行命令 mongod

由于每次都需要在 bin目录下才能运行mongod,我们可以通过环境变量的形式进行配置

  1. 复制一下 目录名称 例如 :C:\Program Files\mongodb-win32-x86_64-windows-5.0.19\bin
  2. 打开编辑变量 找到path 把路径进行追加就好了 
  3. 下次可以在cmd命令窗口测试

 三、命令交互数据库

命令交互也就是通过cmd命令行的形式进行交互

(1)数据库命令

  显示所有的数据库
show dbs
切换到指定的数据库,如果数据库不存在会自动创建数据库
use 数据库名

显示当前所在的数据库

db

删除当前数据库

use 库名
db.dropDatabase()

(2)集合命令

创建集合
db.createCollection('集合名称')

显示当前数据库中的所有集合

show collections
删除某个集合
db.集合名.drop()
重命名集合
db.集合名.renameCollection('newName')

(3)文档命令

插入文档
db.集合名.insert(文档对象);

 查询文档   _id 是 mongodb 自动生成的唯一编号,用来唯一标识文档

db.集合名.find(查询条件)

 更新文档

db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'张三'},{$set:{age:19}})

删除文档

db.集合名.remove(查询条件)

 四、Mongoose

Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/
//1. 安装 mongoose
//2. 导入 mongoose
const mongoose = require("mongoose");
//3. 连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/bilibili");
//4. 设置连接回调
//连接成功
mongoose.connection.on("open", () => {
  console.log("连接成功");
  //5. 创建文档结构对象
  let BookSchema = new mongoose.Schema({
    title: String,
    author: String,
    price: Number,
  });
  //6. 创建文档模型对象
  let BookModel = mongoose.model("book", BookSchema);
  //7. 插入文档
  BookModel.create(
    {
      title: "西游记",
      author: "吴承恩",
      price: 19.9,
    },
    (err, data) => {
      if (err) throw err;
      //输出 data 对象
      console.log(data);
      //8. 断开连接
      mongoose.disconnect();
    }
  );
});
//连接出错
mongoose.connection.on("error", () => {
  console.log("连接出错~~");
});
//连接关闭
mongoose.connection.on("close", () => {
  console.log("连接关闭");
});

字段类型

    title: String,
    price: Number,
    isHot: Boolean,
    category: Array,
    Date: Date,
    Buffer: Buffer,
    Mixed : mongoose.Schema.Types.Mixed, // 接收所有类型
    ObjectId: mongoose.Schema.Types.ObjectId, // 主键 对象ID 用来查询其他表
    Decimal:  mongoose.Schema.Types.Decimal128, // 高精度类型

有些键也可以写出对象的形式,进行字段验证

(1)必填项

title: {
    type: String,
    required: true // 设置必填项
}

 (2)默认值

author: {
    type: String,
    default: '匿名' //默认值
}

(3)枚举值

gender: {
    type: String,
    enum: ['男','女'] //设置的值必须是数组中的
}

(4)唯一值

username: {
    type: String,
    unique: true
}
unique 需要 重建集合 才能有效果

(1)增加一条数据

mongoose.connection.on("open", () => {
    console.log("连接成功");
    let BookSchema = new mongoose.Schema({
        title: String,
        author: String,
        price: Number
    });

    let BookModel = mongoose.model('book', BookSchema);

    BookModel.create({
        title: "《水浒传》",
        price: 15,
    }).then((res) => {
        console.log(res);
        console.log("保存成功!");
    })
   
});

接下来以 模型.操作 为代码

(2)插入多个数据 

 BookModel.insertMany([
        {
            title: "《水浒传》",
            price: 15,
            isHot: true
        },
        {
            title: "《西游记》",
            price: 20,
            isHot: true
        }
    ]).then((res) => {
        console.log(res);
        console.log("保存成功!");
    })

(3)删除一条数据

 BookModel.deleteOne({ _id: "64c604fb363d6aa46652f368" }).then((res) => { 
        console.log(res);
        console.log("删除成功!");
    })

(4)删除多个数据

isHot为false的全部删除

  BookModel.deleteMany({ isHot: false }).then((res) => {
        console.log(res);
        console.log("删除多个成功!");
    })

(5)更新数据

参数1:条件 ,参数2 更新内容

    BookModel.updateOne({ _id: "64c604fb363d6aa46652f362" },{price:99}).then((res) => { 
        console.log(res);
        console.log("更新成功!");
    })

(6)更新多条数据

    BookModel.updateMany({ isHot: true, },{isHot:false}).then((res) => {
        console.log(res);
        console.log("更新多个成功!");
    })

(7)读取条件某一条数据

     BookModel.findOne({ _id: "64c604fb363d6aa46652f362" }).then((res) => { 
        console.log("读取成功!",res);
    })

(8)根据id读取某一条数据

  BookModel.findById("64c604fb363d6aa46652f362").then((res) => { 
        console.log("读取成功!",res);
    })

(9)读取多个数据

   BookModel.find({ isHot: false, }).then((res) => {
        console.log("读取多个成功!",res);
    })

(10)根据查询条件读取

一些条件不能用> < = 这些来使用判断 ,要有相对于的命令符号

  •  > 使用 $gt
  •  < 使用 $lt
  • >= 使用 $gte
  •  <= 使用 $lte
  • !== 使用 $ne

下面举例一些 运算的判断

    // 1.多个条件的查询 价格大于20 并且 isHot 为 false
    BookModel.find({ price: { $gt: 20 }, isHot: false }).then((res) => {
        console.log("价格大于20的", res);
    })
    
    // 2.多个条件的查询都要满足 价格大于20 或者 isHot 为 false
    BookModel.find({ $and: [{ price: { $gt: 20 } }, { isHot: false }] }).then((res) => {
        console.log("价格大于20的", res);   
    })
    

    // 3.多个条件的查询满足一个 价格大于20 或者 isHot 为 false
    BookModel.find({ $or: [{ price: { $gt: 20 } }, { isHot: true }] }).then((res) => {
        console.log("价格大于20的", res);
     })

    // 4. 查询价格在 20 - 30 之间的数据
    BookModel.find({ price: { $gte: 20, $lte: 30 } }).then((res) => {
        console.log("价格大于20的", res);
    })

    // 5.正则查询
    BookModel.find({ title: { $regex: /三国/ } }).then((res) => {
        console.log("查询包含三国的", res);
    })

(11)个性化读取

查找后也可以通过链式调用进行后续的操作,也是进行了Promise的封装

  // 1.只读取出数据的某些字段
    BookModel.find().select({title:1,price:1,_id:0}).then((res) => {
        console.log("筛选结果", res);
    })
    
    // 2.排序 1 升序 -1 降序
    BookModel.find().select({title:1,price:1,_id:0}).sort({price:1}).then((res) => {
        console.log("筛选结果", res);
    })
    
    // 3.数据截取
    BookModel.find().select({title:1,price:1,_id:0}).limit(2).then((res) => {
        console.log("筛选结果", res);
    })
    
    // 4.截取3-4条
    BookModel.find().select({title:1,price:1,_id:0}).skip(2).limit(2).then((res) => {
        console.log("筛选结果", res);
    })

(12)开发常见的操作

 // 登录
  login: async ({ username, password }) => {
    return UserModel.find({ username, password });
  },

  // 更新个人用户信息
  updateUserInfo: async (info) => {
    // 如果没有上传头像,就删除avatar字段 就不更新了
    if (info.image == "") delete info.image;
    return UserModel.updateOne({ _id: info.id }, info)
      .then((res) => {
        return UserModel.findOne({ _id: info.id });
      })
      .catch((err) => {
        console.log("修改失败了", err);
      });
  },

  // 获取用户列表
  getUserList: async ({ pageSize = 10, pageNum = 1, keyword = "" }) => {
    return {
      code: 200,
      msg: "获取成功",
      data: {
        pageNum: pageNum,
        pageSize: pageSize,
        total: await UserModel.find({
          username: { $regex: keyword },
        }).countDocuments(),
        userList: await UserModel.find({ username: { $regex: keyword } })
          .select("-password")
          .skip((pageNum - 1) * pageSize)
          .limit(pageSize),
      },
    };
  },

  // 添加用户
  addUser: async (info) => {
    return UserModel.find({ username: info.username }).then((res) => {
      console.log("res", res);
      if (res.length) {
        return { code: 500, msg: "用户名已存在" };
      } else {
        UserModel.create(info);
        return { code: 200, msg: "添加成功", data: { userInfo: info } };
      }
    });
  },

  // 删除用户
  deleteUser: async (info) => {
    return UserModel.deleteOne({ _id: info.id }).then((res) => {
      console.log(res, "res");
      if (res.deletedCount) {
        return { code: 200, msg: "删除成功" };
      } else {
        return { code: 500, msg: "删除失败" };
      }
    });
  },

  // 更新用户信息
  updateUser: async (info) => {
    if (info.password == "") delete info.password;
    return UserModel.updateOne({ _id: info._id }, info)
      .then((res) => {
        console.log(res, "res");
        if (res.modifiedCount) {
          return { code: 200, msg: "更新成功" };
        } else {
          return { code: 500, msg: "更新失败" };
        }
      })
      .catch((err) => {
        console.log(err);
      });
  }

五、图形化管理

Robo 3T 免费 https://github.com/Studio3T/robomongo/releases
Navicat 收费(可以去某站安装破解版教程)  https://www.navicat.com.cn/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React实现关键字高亮

先看效果&#xff1a; 实现很简单通过以下这个函数&#xff1a; highLight (text, keyword ) > {return text.split(keyword).flatMap(str > [<span style{{ color: red, fontWeight: bold }}>{keyword}</span>, str]).slice(1);}展示某段文本时调用该函数…

【从零开始学习JAVA | 第四十二篇】初学网络编程

目录 前言&#xff1a; 什么是网络编程&#xff1a; 网络编程的应用场景&#xff1a; 常见的软件架构&#xff1a; CS架构&#xff1a; BS架构&#xff1a; 网络编程三要素&#xff1a;​ 总结&#xff1a; 前言&#xff1a; 当今互联网已经渗透到我们日常生活的方方面…

【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate

目录 一、导入依赖与配置信息 二、导入测试数据创建实体类 三、插入数据 1、Insert默认集合插入 2、Insert指定集合插入 3、Insert批量插入数据 4、save默认集合插入 5、save指定集合插入 6、insert与save的区别 四、修改数据 1、修改符合条件的第一条数据 2、全…

单例模式-java实现

介绍 单例模式的意图&#xff1a;保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图&#xff1a;一般的单例的实现&#xff0c;是属性中保持着一个自己的私有静态实例引用&#xff0c;还有一个私有的构造方法&#xff0c;然后再开放一个静态的获取实例的方法给外界…

golang内存对齐

为什么要内存对齐&#xff1f; CPU访问内存时&#xff0c;以CPU的位数为单位进行访问。 如果访问未对齐的内存&#xff0c;处理器需要做两次内存访问&#xff0c;对齐的内存的访问可能仅需要一次&#xff0c;利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…

MySql学习3:常用函数

常用字符串函数 CHAR_LENGTH(s)&#xff1a;返回字符串的长度 select *, char_length(name) as nameLength from emp;CONCAT(s1,s2…sn)&#xff1a;字符串拼接 select name,concat(name,入职时间&#xff1a;,entrydata) as 入职时间 from emp;CONCAT_WS(x, s1,s2…sn)&a…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局

Thymeleaf页面布局 熟悉Thymeleaf的语法和表达式后&#xff0c;后面开发起来会更加得心应手。接下来好好研究一下Thymeleaf如何实现完整的Web系统页面布局。 1.引入代码片段 在模板中经常希望包含来自其他模板页面的内容&#xff0c;如页脚、页眉、菜单等。为了做到这一点&a…

【从零开始学习JAVA | 三十九篇】深入多线程

目录 前言&#xff1a; ​1.线程的寿命周期​ 2.线程的安全问题 3.锁 同步代码块&#xff1a; 同步方法&#xff1a; 死锁&#xff1a; 4.生产者和消费者模式&#xff08;等待唤醒机制&#xff09; 总结&#xff1a; 前言&#xff1a; 当今软件开发领…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

Echart(v5)实现中国地图区域图

一、需求背景 需要实现一个中国地图的区域图&#xff08;区域级别到市&#xff09;&#xff0c;并且指定区域可以高亮。 二、相关工具 1、中国的GeoJSON数据获取&#xff1a;DataV.GeoAtlas地理小工具系列 2、Echart组件库 Apache ECharts 三、实现 echart配置&#xff1a; …

MySQL查看当前数据库视图-SQL语句

引言 查询语句为&#xff1a; show full tables where table_type 可查询当前数据库表 一&#xff0c;创建一个视图 # 创建视图 create view v_stu as # 视图内容&#xff08;连接的一个表&#xff09; select name from t_stu union all select tname from t_teach; 二&…

RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V

注释&#xff1a;编译Fedora&#xff0c;HS-2 64核RISC-V服务器比Ryzen5700x快两倍&#xff01; --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…

2.4 网络安全新技术

数据参考&#xff1a;CISP官方 目录 云计算安全大数据安全移动互联网安全物联网安全工业互联网安全 一、云计算安全 1、云计算定义 云计算是指通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式。在云计算中&#xff0c;计算资…

Goland搭建远程Linux开发

Windows和Linux都需要先构建好go环境&#xff0c;启用ssh服务。 打开Windows上的Goland&#xff0c;建立项目。 点击添加配置&#xff0c;选择go构建 点击运行于&#xff0c;选择ssh 填上Linux机器的IP地址和用户名 输入密码 没有问题 为了不让每次运行程序和调试程序都生…

AIGC自动生成内容真的好吗

一、前言 博主认为某些技术领域的发展对人类而言&#xff0c;并没有多大的益处。反而让人类更加困扰。纵观这几十年的技术发展&#xff0c;日新月异&#xff0c;但是人类生活的幸福指数并没有提高&#xff0c;反而产生了无数的社会问题。 AI大模型迅速发展&#xff0c;A…

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…

FirmAE 模拟固件

一、介绍 FirmAE目标是创造一个可以供用户动态调试分析的环境&#xff0c;而不是复现和硬件一模一样的环境,&#xff0c;其卖点是大规模(Large-Scale)。 论文开头就直指“友商”Firmadyne&#xff0c;提出其模拟成功率低等问题&#xff0c; 其将原本Firmadyne的成功率16.28%提高…

Navicat 导出excel表数据结构

效果展示&#xff1a; 实现过程&#xff1a; 1 打开Navicat 执行以下SQL&#xff0c;注意&#xff1a;将以下SQL中的数据库名称和表名称替换。 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, C…