【Node.js】MongoDB 快速使用

1. 关系型与非关系型数据库

关系型数据库(RDBMS)和非关系型数据库(NoSQL)是两种不同类型的数据库管理系统。

关系型数据库是基于关系模型的数据库。它使用表(关系)来保存数据,并且通过事先定义的结构(表的列)和关系(表之间的关联)来组织数据。关系型数据库使用SQL(结构化查询语言)作为查询和操作数据的标准语言,例如常见的MySQL、Oracle、SQL Server等。

非关系型数据库则是一种灵活的数据存储方式,不使用表、行、列的结构。它们可以存储各种不同类型的数据,包括文档、键值对、列族等。非关系型数据库通常以键值对(例如Redis)或者文档(例如MongoDB)的形式储存数据。这些数据库的设计目标通常是在大规模数据的读写上提供高性能和可扩展性。

关系型数据库和非关系型数据库在以下几个方面有所区别:

  1. 数据结构:关系型数据库使用表格和SQL来存储和查询数据,而非关系型数据库使用各种不同的数据结构,如键值对、文档或者列族。
  2. 数据一致性:关系型数据库通常支持事务处理,保证数据的一致性和完整性,而非关系型数据库则更注重分布式、高性能的读写操作。
  3. 可扩展性:非关系型数据库通常更容易水平扩展,可以在需要时添加更多的服务器以满足系统的需求,而关系型数据库在扩展性方面相对不足。
  4. 数据库处理方式:关系型数据库采用结构化查询语言(SQL)进行操作和查询,而非关系型数据库更注重API的灵活性和数据的快速存取。

2. MongoDB 基本介绍

MongoDB是一种非关系型数据库,采用文档导向的数据存储方式,通过JSON-like的文档结构来存储数据。

以下是MongoDB的一些特点:

  1. 非关系型数据库:MongoDB使用集合(Collection)来存储和组织数据,集合类似于关系型数据库中的表,但没有固定的结构,不需要事先定义表结构即可存储数据。

  2. 文档导向:MongoDB使用文档(Document)来表示数据记录,文档是一个包含键值对的数据结构,类似于关系数据库中的行,但文档可以具有非常灵活的结构,因此非常适合存储半结构化和非结构化数据。

  3. 强大的查询语言:MongoDB提供灵活和强大的查询语言,支持基本的查询操作,包括条件过滤、排序、投影等,也支持复杂的聚合查询、文本搜索和地理空间查询等。

  4. 高性能和可扩展性:MongoDB被设计为高性能和可扩展的数据库,它采用的是基于内存的数据访问模式,具有快速的读写能力。此外,MongoDB还支持水平扩展,可以通过分片技术将数据分布到多个服务器上,以提高系统的吞吐量和负载能力。

  5. 自动故障恢复:MongoDB具备自动故障恢复的功能,它能够在节点崩溃或网络中断的情况下自动恢复,并保持数据的一致性。

  6. 灵活的数据复制和分发:MongoDB支持数据复制和分发,可以通过复制集(Replica Set)来提高数据的可用性和容错性,也可以通过分片技术来进行数据的水平划分和负载均衡。

在这里插入图片描述

加入用 JSON 可以表示为:

{
  "accounts": [
    {
      "id": "3-YLju5f3",
      "title": "买电脑",
      "time": "2023-02-08",
      "type": "-1",
      "account": "5500",
      "remarks": "为了上网课"
    },
    {
      "id": "3-YLju5f4",
      "title": "请女朋友吃饭",
      "time": "2023-02-08",
      "type": "-1",
      "account": "214",
      "remarks": "情人节聚餐"
    },
    {
      "id": "mRQiD4s3K",
      "title": "发工资",
      "time": "2023-02-19",
      "type": "1",
      "account": "4396",
      "remarks": "终于发工资啦!~~"
    }
  ],
  "users": [
    {
      "id": 1,
      "name": "zhangsan",
      "age": 18
    },
    {
      "id": 2,
      "name": "lisi",
      "age": 20
    },
    {
      "id": 3,
      "name": "wangwu",
      "age": 22
    }
  ]
}

在这里插入图片描述

3. MongoDB 的使用

3.1 安装

安装地址
或者是 :https://www.mongodb.com/try/download/community

3.2 启动

在 mongod.exe 所在的 bin 文件夹内打开 cmd 终端(将服务端开启并连接到某个 db 文件夹下):

# 需要先手动创建一个 db 文件夹
.\mongod.exe --dbpath=C:\data\db
# 或者直接执行 mongod 默认 db 文件夹路径为 C:\data\db 所以需要我们提前手动创建一个文件夹
# mongod

这样我们就启动了 mongod 服务,可在服务中查看是否启动,手动启动需要我们一直保持 cmd 不关闭。如果在服务中设置为了 自动启动,那么 cmd 可以关闭,之后也会自动启动 mongod 服务。

安装 mongosh (方便直接操作 mongodb 的环境),在 mongod.exe 所在的 bin 文件夹内打开 cmd 终端,执行 mongosh ,连接到本地数据库端口,开启客户端。(当然也可以利用可视化工具自带的驱动进行连接)

在这里插入图片描述

3.3 命令行操作

在这里插入图片描述

4. Node.js 连接操作 MongoDB

4.1 概述

Mongoose 是一个对象文档模型库(mongodb 数据库 驱动),方便直接操作数据库。

4.2 操作数据库

  1. 连接数据库
// 1. 安装并导入 mongoose
const mongoose = require('mongoose');
// 2. 连接 mongodb 服务
mongoose.connect('mongodb://127.0.0.1:27017/xx_project')
  1. 创建模型
const Schema = mongoose.Schema;
const UserType = {
  username: String,
  password: String,
  age: Number
}

const UserModel = mongoose.model('user', new Schema(UserType));
module.exports = UserModel;
  1. 增删改查
var express = require('express');
var router = express.Router();
const UserModel = require('../models/user');

/* GET users listing. */
router.get('/', function (req, res, next) {
  res.send('respond with a resource');
});

router.post('/user/add', (req, res) => {
  console.log(req.body)
  // 插入数据库
  // 1. 创建一个模型
  const { username, password, age } = req.body;

  UserModel.create({
    username,
    password,
    age
  }).then(data => {
    console.log(data)
  })
  res.send({
    ok: 1
  })
})

router.post('/user/update/:id', (req, res) => {
  console.log(req.body, req.params.id)
  const { username, password, age } = req.body;
  UserModel.updateOne({ _id: req.params.id }, {
    username,
    password,
    age
  }).then(data => {
    res.send({
      ok: 1
    })
  })

})
router.get('/user/delete/:id', (req, res) => {
  console.log(req.params.id)
  UserModel.deleteOne({ _id: req.params.id }).then(data => {
    res.send({
      ok: 1
    })
  })
})

router.get('/user/find', (req, res) => {
  UserModel.find().sort({age:-1}).then(data => {
    res.send(data)
  })
})

module.exports = router;
  1. 断开连接
mongoose.disconnect();
  1. 连接出错
//连接出错
mongoose.connection.on('error', () => {
 console.log('连接出错~~');
 })
  1. 连接关闭
//连接关闭
mongoose.connection.on('close', () => {
 console.log('连接关闭');
 })

4.3 字段类型

在这里插入图片描述

4.4 字段校验

title: {
 type: String,
 required: true // 设置必填项
},
author: {
 type: String,
 default: '匿名' //默认值
},
gender: {
 type: String,
 enum: ['男','女'] //设置的值必须是数组中的
},
username: {
 type: String,
 unique: true // 唯一值
 },

4.5 条件控制

运算符

在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号

  • > 使用 $gt
  • < 使用 $lt
  • >= 使用 $gte
  • <= 使用 $lte
  • !== 使用 $ne
db.students.find({id:{$gt:3}});  id号比3大的所有的记录
逻辑运算

$or 逻辑或的情况

db.students.find({$or:[{age:18},{age:24}]});

$and逻辑与的情况

db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]});
正则匹配

条件中可以直接使用 JS 的正则语法,通过正则可以进行模糊查询

db.students.find({name:/imissyou/});
个性化读取

字段筛选

//0:不要的字段
//1:要的字段
SongModel.find().select({_id:0,title:1}).exec(function(err,data){
 if(err) throw err;
 console.log(data);
 mongoose.connection.close();
 });

数据排序

//sort 排序
//1:升序
//-1:倒序
SongModel.find().sort({hot:1}).exec(function(err,data){
 if(err) throw err;
 console.log(data);
 mongoose.connection.close();
 });

数据截取

//skip 跳过   limit 限定
SongModel.find().skip(10).limit(10).exec(function(err,data){
 if(err) throw err;
 console.log(data);
 mongoose.connection.close();
 });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值