express的使用(五) 简单的使用mongodb

news2024/9/24 1:23:10

原文链接

express的使用(五) 简单的使用mongodb
不要脸的求关注,希望能让大家批评我的不足点,一键三连最好了

看前提示

本篇主要描述关于express中使用mongodb以及mongodb的简单介绍还有初步使用,不涉及任何常用的语法,不建议有mongodb跟项目经验开发的人看。

名词介绍

NoSQL

对于nosql,相比是大家第一次接触mongodb的时候都被宣传的一个概念,先黏贴一段介绍吧

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

从新手理解的角度来说,即传统的表格被剔除了,取而代之的是一个又一个的BSon数据,且格式不做要求,如:一开始的格式为{id:1,phone:1},后续开发,表格添加了ip字段,而我们不需要在表上添加ip字段,只需要直接修改数据的内容为{id:1,ip:2}即可

database collection document field

这四者为了让大家有个直观的感觉,就直接贴上一张图来说明,包含关系,

database>collection>document>field

ObjectId

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时,接下来的 3 个字节是机器标识码,紧接的两个字节由进程 id 组成 PID,最后三个字节是随机数

objectId对我们来说是一个唯一标识,更多时候只是用来解析,看看这条数据的生成时间

MongoDB Compass

一个可以直观查看到我们db中数据的工具,毕竟几千万条数据的时候,用terminal打印出来还是很离谱的。

下载并安装mongodb

https://www.mongodb.com/try/download/community

在菜鸟教程上有不错的安装教程,我就直接粘贴过来,我不希望做太多没用的重复工作,毕竟人家有了直观的教程

https://www.mongodb.com/try/download/communityhttps://www.mongodb.com/try/download/community

mongodb 6.x后的版本需要另外安装shell,才可以启动mongodb的服务

https://www.mongodb.com/try/download/shell

启动并连接mongodb

在上一步下载shell还有mongodb之后,记得分别切换到bin的目录下。再打开两个终端。

启动mongodb的服务

net start MongoDB

关闭mongdb的服务

net stop MongoDB

连接本地的mongodb服务

.\mongosh mongodb:localhost
请注意,由于没有配置环境变量的path,所以需要在运行命令时候使用./的方式

使用shell操作mongodb

本意是直接使用代码来操作db,但是我还是希望大家有个直观的概念,所以在这儿不合时宜的介绍下mongodb的一些shell操作,以便加深大家的理解还有记忆能力

查看当前mongodb的信息

show dbs

切换库

如果库存在,会直接切换过去,如果不存在会直接创建并且切换过去

 use td_hero_shell

创建collection

db.createCollection("hero")

增加数据

db.hero.insertOne(
  {
    time: "2023-05-26",
    timestampt: "1685062800000",
    hero_name: "爆破鬼才",
    from: "新玩家七天奖励",
    from_index: 1
  })

修改数据

db.hero.updateOne(
  { hero_name: "爆破鬼才" },
  { $set: { "hero_name": "爆破大师" } 
})

删除数据

db.hero.deleteOne(
  { _id: ObjectId("648c94102db900a4b21705aa") }
)

批量输入数据

db.hero.insertMany([
  {
    time: "2023-05-26",
    timestampt: "1685062800000",
    hero_name: "爆破大师",
    from: "新玩家七天奖励",
    from_index: 1
  },
  {
    time: "2023-05-30",
    timestampt: "1685062800000",
    hero_name: "炎魔",
    from: "勇气宝箱",
    from_index: 2
  }
])

查看数据

db.hero.find()

mongodb compass查看数据

2023-06-17 12:37,在笔者编辑文章的时候,1.3.7版本会有报错,因此降低了版本为1.2.5
https://www.filehorse.com/download-mongodb-compass/58166/download/

使用代码操作mongodb

依赖版本

"mongoose": "^7.3.0"

mongoose文档链接

https://mongoosejs.com/

接入mongoose

首先,写代码之前,我们可以看下mongoose中的"快速开始",最简洁的代码如下,实现的功能也是很简单,就是将mongoose接入到我们的项目中,并且让我们连接到db去

const mongoose = require('mongoose');
main().catch(err => console.log(err));
async function main() {
  await mongoose.connect('mongodb://127.0.0.1:27017/test');
  // use `await mongoose.connect('mongodb://user:password@127.0.0.1:27017/test');` if your database has auth enabled
}

而我们考虑下我们代码的实际情况,可以将db连接部分的js文件写在一个专属的文件中,然后再server.js中去引入并使用它,主打的就是一个分工合作。方便抽离

const mongoose = require('mongoose');
// 链接到mongodb
// 获取链接的实体对象
const connect = mongoose.connection
// 连接的error处理
connect.on("error", () => {
    console.log("mongodb链接错误============>");
})
// 只监听一次的连接打开
connect.once('open', () => {
    console.log("mongodb连接打开了========>")
})
mongoose.dbConnect = () => {
    mongoose.connect('mongodb://localhost/td_hero_shell');

}

module.exports = mongoose;
const mongodb=require("./src/db");
const express = require("express");
const app = express();
const path = require("path");

const { blogRouter } = require("./src/router/blog");
const { userRouter } = require("./src/router/user");

app.listen(3000, () => {
  console.log("服务已启动");
});
//
mongodb.dbConnect();
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");

//cookie模块
const cookieParser = require("cookie-parser");
app.use(cookieParser());
app.use("/blog", blogRouter);
app.use("/user", userRouter);

运行之后,效果如下

但是此时还是没有真正的操作到数据库,我们需要了解下一个schema的概念

Schema

Schema,即XML Schema,XSD (XML Schema Definition)是W3C于2001年5月发布的推荐标准,
指出如何形式描述XML文档的元素。XSD是许多XML Schema 语言中的一支。
XSD是首先分离于XML本身的schema语言,故获取W3C的推荐地位。

简单来说,schema就是如何描述一个文档,而在mongoose中,一个schema表示的是一个collection的映射,可以大概的理解为一个schema表示一个collection

Everything in Mongoose starts with a Schema. Each schema maps to a MongoDB collection and defines the shape of the documents within that collection.

schema 中field的类型有如下几种

String
Number
Date
Buffer
Boolean
Mixed
ObjectId
Array

按照上面shell的测试线路,编写了以下的基础schema类型

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

// 定义一个hero的collection,用于存放获取英雄卡片的时间记录
var heroSchema = new Schema({
    time: "string",
    timestampt: "Date",
    hero_name: "string",
    from: "string",
    from_index: "number"
});

接下来。我们怎么使用这个schema,需要了解到model的概念

Model

Models 是从 Schema 编译来的构造函数。 它们的实例就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。

下面的代码中,请注意

model只是获取到collection的document。
如果没有的时候会创建一个document,有的时候是直接去读取
在model的命名中,添加了第三个参数,是因为mongo的自动添加s原因,而前面的hero的collection是没有s,所以需要做collection名称的限制
为了方便,将db的find方法直接放在了conection方法中,正常开发是在需要调用数据库的时候查询的。

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

// 定义一个hero的collection,用于存放获取英雄卡片的时间记录
const schemaList = {
    "hero": new Schema({
        time: "string",
        timestampt: "Date",
        hero_name: "string",
        from: "string",
        from_index: "number"
    })
};
const getModel = (name) => {
    if (schemaList[name]) {
        return mongoose.model(name, schemaList[name], name)
    }
};
module.exports = { getModel }
const mongoose = require('mongoose');
const db = require("./schema");
const dbLink = "mongodb://localhost/td_hero_shell";
// 链接到mongodb
// 获取链接的实体对象
const connect = mongoose.connection
// 连接的error处理
connect.on("error", () => {
    console.log("mongodb链接错误============>");
})
// 只监听一次的连接打开
connect.once('open', async () => {
    console.log("mongodb连接打开了========>")
    const data = await db.getModel("hero").find({});
    console.log("当前查询mongodb的hero表的数据======>");
    console.log(data);

})
mongoose.dbConnect = () => {
    mongoose.connect(dbLink);

}

module.exports = mongoose;

至此,事情结束,本来想继续写的,但是看了下字,三千多了,没必要写那么多,后续也会专门记一下关于mongodb的博客。

备注

启动mongodb的指令,可以根据自己的工具来提示


PS D:\mongodb\bin> mongod --dbpath E:/dbdata
mongod : 无法将“mongod”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ mongod --dbpath E:/dbdata
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (mongod:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
Suggestion [3,General]: 找不到命令 mongod,但它确实存在于当前位置。
默认情况下,Windows PowerShell 不会从当前位置加载命令。
如果信任此命令,请改为键入“.\mongod”。有关详细信息,
请参阅 "get-help about_Command_Precedence"。
PS D:\mongodb\bin> .\mongod --dbpath E:/dbdata
mongodb在6后面的版本中,都已经将mondo的shell抽离出来了,
所以想要用旧的方式启动服务的时候,需要重新安装shell

退出shell的方式

输入exit,然后回车,就可以了

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

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

相关文章

算法刷题-双指针-反转链表

反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 题意:反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2-…

AMD CPU微架构分析

一、SoC架构 1.1 整体架构 Zeppelin 参考链接:wikichip: Zeppelin 通过infinity fabric总线将单die分成多die的SoC架构,每个Die包含两个CPU核(CCX)、2各DDR通道、USB、低功耗IO以及多个IFOP和IFIS serdes接口。 如下所述中&…

干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…

vue jointjs 拓扑图 自定义shape 按需引入

只展示部分核心代码,完整代码见文章尾部连接 import jointjs/dist/joint.core.css;// 类库 包含: Paper Graph Cell CellView Element Link 等等 import { dia } from jointjs/src/core.mjs; // 样式库 包含多个分组(basic standard custom ...) import * as standa…

基于Hexo和Butterfly创建个人技术博客,(11) 使用插件增强博客站点能力

Butterfly官方网站,请 点击进入 本章目标: 掌握常用的plugin插件的用法,本文中是butterfly主题内置集成的第三方插件(部分插件需要再次安装); 一、建议开启的三方插件 KaTeX-数学公式 katex:enable: true# true 表示每一页都加载…

C# NX二次开发:通过UFUN函数获取刀具描述,目录号,库号等信息

今天要将的是,在NX中对CAM模块进行二次开发的时候,往往需要获取一些关于刀具使用的信息,这些信息用NXOPEN的的方法录制也可以录制出来,但是录制出来的代码,往往都是一种刀具类型会出现一个Builder。这样在你不知道有多…

淘宝买家订单API

目录 下载安装与运行 支持的订单读取方式 请求数据格式一 请求头示例 数据格式说明 数据格式示例 返回数据格式一 返回头示例 数据格式说明 数据格式示例 请求数据格式二(根据订单编号) 请求头示例 返回数据格式二(根据订单编号…

【随笔记】如何获得铁粉(仅供参考)

文章目录 一、前言二、秘籍2.1 良好的个人简介2.2 统一的文章格式2.3 详细的专栏划分2.4 有序的博客排版2.4.1 目录部分2.4.2 正文部分2.4.2.1 标题分级2.4.2.2 正文分段2.4.2.3 善用多级列表2.4.2.4 章节分割 三、总结 一、前言 在这篇随笔记的开始,我想声明一下&a…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后,该聊天机器人被广泛谴责为一种免费的论文写作、应试工具,它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

【Java】Java核心要点总结 67

文章目录 1. 浮点数运运算会有精度损失2. 构造方法特点 & 不能被重写3. 接口和抽象类的异同4. Object 类的常见方法5. hashCode() 有什么用 为什么要有 hashCode() 1. 浮点数运运算会有精度损失 这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的&#x…

面试时一定要确认该岗位的直属领导是否在场,如果不在,千万不要接offer,有坑!...

对于有心人来说,面试时可以看出许多隐形信息,比如下面这位网友的提醒: 面试时一定要确认这个岗位的直接汇报领导是否参与了面试,如果没有参与,千万不要接offer! 该职位的直接领导不参与面试,只能…

NLP——Topic Modelling

文章目录 A Brief History of Topic ModelsLatent Dirichlet Allocation (LDA)潜在狄利克雷分布核心思想LDA inputLDA output LDA 如何学习Sampling-based mothods 基于采样的方法Infer Topics For New Documents超参数 Variational methods 变分方法 Ev…

java协同过滤算法的校园二手图书网站springboot vue

用户:(商品推荐算法) 1)首页主要由导航栏、图书展示页、分页所组成。访客能浏览网站上的待出售图书的信息,但是若要购买,收藏图书,查看卖家信息则会自动跳转到登录界面,已经登录的用户则可以浏…

WPS AI最全申请与使用手册;AIGC制作游戏音乐;便宜快捷使用完整版SD;人人都能看懂的ChatGPT原理课 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 面向虚拟世界的生成式AI市场全景图 作者在这篇文章中探讨了生成式AI在虚拟世界的应用,并绘制了 Market Map V3.0 (市场全景…

C++ 有用的资源||19道必须掌握的C++面试题

C 有用的资源 C 有用的资源 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Programming Language Tutorials − C 编程语言教程。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现实生活应用。C FAQ −…

chatgpt赋能python:Python中的遍历方法详解

Python中的遍历方法详解 在Python中,遍历是处理数据的常见操作。Python提供了多种遍历方法,本文将逐一介绍这些方法的特点、适用场景及使用方法。 for循环 for循环是Python中最常用的遍历方法之一,可以遍历任何可迭代对象。 # 遍历列表 f…

栈的运用——中缀表达式[Java实现]

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C代码。 ⭐如果觉得文章写的…

C++【位图/布隆过滤器—海量数据处理】

文章目录 一、位图(1)位图概念介绍(2)简单模拟实现(3)位图应用 二、布隆过滤器(1)关于布隆过滤器概念及介绍(2)布隆过滤器的使用场景(3&#xff0…

干翻Mybatis源码系列之第十一篇:Mybatis拦截器获取被拦截对象的方法和参数

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…

DJ4-1 网络层概述

目录 一、网络层提供的功能 二、路由和转发 三、数据平面和控制平面 四、网络层的服务模型 一、网络层提供的功能 网络层实现主机与主机之间的通信 从发送方主机传输报文段到接收方主机: 发送方主机封装报文段 (segments) 为数据报 (datagrams)接收方主机递交…