【后端开发实习】用MongoDB实现仓库管理的出库入库实战

用MongoDB实现仓库管理的出库入库

  • MongoDB
    • 什么是MongoDB
    • MongoDB安装以及开始运行
    • 配置启动以及mongosh
    • mongodb的基础使用命令
      • 启动和使用MongoDB服务
      • 数据库操作
      • 集合操作
      • 文档操作
  • 项目部署
    • 在数据库中创建一张商品信息表
    • 提供信息表的增删改查操作接口

MongoDB

什么是MongoDB

Mongodb是一种比较常见的NoSQL类型数据库,所谓NoSQL就是Not only SQL,非关系型数据库,数据在MongoDB中的存储相比MySQL而言比较松散,并没有特定的数据结构,存储方式类似JSON,采用了一种二进制的BSON来进行数据存储。但是MongoDB由于以下的几个优势在互联网需要处理海量数据场景下有独特的优势,比较经典的应用场景有微信和Twitter每天数以TB甚至PB级别的数据量。

  1. 高性能
  2. 高可用
  3. 高扩展
  4. 丰富的查询支持

MongoDB安装以及开始运行

在这里插入图片描述
安装成功运行会看到上面这张结果图。

配置启动以及mongosh

在命令行中输入如下命令:

 sudo vim /etc/systemd/system/mongodb.service

在打开的mongodb.service文件中填入以下内容:

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf[Install]
WantedBy=multi-user.target

在这里插入图片描述
配置成功以后输入mongo就可以与数据库连接上并进行相关操作。

mongodb的基础使用命令

启动和使用MongoDB服务

# 重新加载配置,并启动mongodb
sudo systemctl daemon-reload
sudo systemctl start mongod# 查看运行状态
sudo systemctl status mongod
# 如果mongodb状态为stop,则运行 sudo systemctl enable mongod# 停止mongodb
sudo systemctl stop mongod# 重启mongodb
sudo systemctl restart mongod

数据库操作

# 创建和切换数据库,命名规范:全部小写
use dbname
# 删除数据库,主要是用来删除已经从内存持久化到磁盘中的数据库
db.dropDatabse()
# 显示已经创建的数据库
show dbs

集合操作

# 创建集合
db.createCollection("collectionname")
# 删除集合
db.collectionname.drop()
# 显示已经创建的数据库
show dbs

!注:这里还有一个是集合的隐式创建,通过在文档操作的时候insert操作如果没有匹配到现有数据库,就创建一个。

文档操作

# 创建文档
db.collectionname.insert({BSON格式数据})
# 文档数据查询
db.collectionname.find()
# 文档数据更新,直接使用是覆盖更新
db.collectionname.update(query, update, options)
# 局部更新,使用$set修改器
db.collectionname.update({userId:"1001"},{$set:{username="张三"}})
# 批量更新,在option选项中增加multi:true
db.collectionname.update({userId:"1001"},{$set:{username="张三"}})
# 文档删除,如果没有带条件就是“删库跑路”
db.collectionname.remove(query)

! 注:mongodb中默认的是浮点类型的数据,因此想使用整型变量的时候需要用NumberInt函数进行转换。

项目部署

在数据库中创建一张商品信息表

在这里插入图片描述
由于已经有MongoCampass这个图形化的工具,在创建的时候可以使用这个提高效率而不用一行一行输入数据。
在这里插入图片描述
创建好集合以后就可以向集合中插入文档数据,编辑好一行以后按加号继续编辑下一行。

提供信息表的增删改查操作接口

这个部分的内容有一位大佬总结的很好了,这里贴出他的博客,非常建议学习,他总结的关于Schema和Collection还有Document之间的关系使我茅塞顿开。

//引入mongodb数据库 => MongoClient mongo =>客户端
const {MongoClient} = require("mongodb");// mongo连接网址
const url = 'mongodb://127.0.0.1:27017';//mongo连接 数据库名称
const dbName = 'Shop';async function connect() {
// 注意点:由于 MongoClient.connect() 返回的是一个promise对象 因此可以使用async 和 await
// console.log(MongoClient.connect(url)); //(MongoClient.connect(url) 返回一个Promise对象)const client = await MongoClient.connect(url); //链接数据库const db = client.db(dbName); //匹配数据库return {client,db}
}//数据库操作之 增函数 参数1:集合 参数2:data数据(增的数据)
async function insert(colName, data) {
//1:链接数据库 并且把db 和 client在链接数据库中导出 let {db,client} = await connect()//2:匹配数据库集合const collection = db.collection(colName);
//3:需要判断传入的数据 是一条还是多条 一条就是insertOne 多条就是insertMany 在集合之中插入数据 const result = await collection[Array.isArray(data) ? "insertMany" : "insertOne"](data);
//3:关闭数据库连接client.close();return result;
}//数据库之 改
// `db.集合的名称.updateOne( {name:"ppp",age:10 } , { $set : { name:"嘿嘿",age:20} } );`
//根据id来修改 数据库中的data
async function update(colName, query, newData) { //newData{$set:{price:200,qty:2},$inc:{view:1}}let {db,client} = await connect();let collection = db.collection(colName);//根据id删除 数据if (query._id && typeof query._id === 'string') {query._id = ObjectId(query._id);}let result = await collection.updateOne(query, newData);console.log("result" + result);return result;}//数据库之 删 
// `db.集合的名称.deleteMany({name:"ppp"})`
async function remove(colName, query) {//1:链接数据库let {db,client} = await connect()//根据id删除 数据if (query._id && typeof query._id === 'string') {query._id = ObjectId(query._id);}//2:匹配集合let collection = db.collection(colName);//判断是删除一条还是多条let result = await collection.deleteMany(query);client.close();return result;}
// //查 函数
// 操作数据库的前提是:引入数据库,还有连接网址,连接数据库名称,数据库的链接
// 方法里面:数据库的链接(里面有着:链接数据库 匹配数据库集合,最后根据所选的集合 操作数据库) 最后关闭数据库!
async function find(colName, query = {}, options = {}) { //参数1:数据库中的集合(表) 参数2:操作的数据库语句 参数3:配置参数 //1:链接数据库let {db,client} = await connect();//2:匹配数据库集合 let collection = db.collection(colName);//3:最后根据所选的集合 操作数据库 查询操作let result = collection.find(query);//分页功能 需要的参数:页数 限制显示的多少页 跳过的数据条数 eg: 1页-0~5-0条 2页-5~10条-5条 3页-10~15-10条//01:查询跳过的记录if (options.skip) {result = result.skip(options.skip) //result.skip()方法 设置跳过记录 }//02:设置显示的条数if (options.limit) {result = result.limit(options.limit)}//排序的功能if (options.sort) { //前端传来的之 ["price"] 或者["price","1"] 第一种为默认的降序 第二种为升序let key, val;key = options.sort[0]; //拿到key值 if (options.sort.length > 1) {val = options.sort[1] * 1;} else {val = -1;}result = result.sort({ //对象[字符串] [key]: val})}result = await result.toArray(); //返回的是一个数组的形式!给与前端!//最后 客户端关闭数据库  client.close();return result; //返回查询结果 一个promise对象}//把增删改查 到出  在引入这个工具函数时候 调用!module.exports = {insert,find,update,remove}

调用接口:

const express = require("express");
const router = express.Router();const mongo = require("./mongo");
const { ObjectId } = require("mongodb");const colc_name = "goods"
//post 方式 增加数据 
router.post("/insert", async (req, res) => {// `db.集合的名称.insertMany([{name:"名称",age:11},{name:"www",age:20}])`// insert() 参数1:数据库集合 参数2:插入的数据 插入一条数据的话 直接一个对象 插入多条数据的话 [{},{}] 对象里面书写插入的参数!// let result = await mongo.insert("goods2", {//   "name": "ppp",//   "purchase": "1件起购",//   "oldprice": 12345.00,// });let result = await mongo.insert(colc_name, [{"name": "ppp","purchase": "1件起购","oldprice": 222,}, {"name": "lll","purchase": "1件起购","oldprice": 111,}]);res.send("插入成功"+result);
})
//查询
router.get("/search", async (req, res) => {//分页效果!//设置默认显示的条数还有第几页 并且获取到前端发来的请求参数!let {//page 第一页 size为显示条数大小为10 sort默认的排序(降) 根据nowPrice排序 注意点:nowPrice一定是数值型! 不带""page = 1, size = 10, sort = "oldprice"} = req.query;//设置skip跳过的记录 还有限制显示的那些数据条数let skip = (page - 1) * size;let limit = size * 1;//排序的参数处理sort = sort.split(","); //参数传递:price,1等等!  ['price'],['price','-1']//find()参数:参数1:数据库中的集合(表) 参数2:操作的数据库语句 参数3:配置参数 let result = await mongo.find(colc_name, {}, {skip,limit,sort});res.send(result);
})
//删除数据
router.delete('/:id', async (req, res) => {// router.delete('/:name', async (req, res) => {const {id// name} = req.params;// console.log("name" + name);var objectId = new ObjectId(id)try {const result = await mongo.remove(colc_name, {_id: id})// const result = await mongo.remove('goods2', {//   name: name// })res.send('success')return result;} catch (err) {res.send(err);}})
//修改数据router.put("/:id", async (req, res) => {let {id} = req.params;console.log("id" + id);// let whereDate = {//   name: "ooo"// }let whereDate = {_id: id}let updataDate = {$set: {name: "zzz",oldPrice: 200,},$inc: {view: 1}}console.log(whereDate, updataDate); //oktry {let result = await mongo.updata(colc_name, whereDate, updataDate);res.send("success");} catch (err) {res.send("fail")}})
module.exports = router;

在定义了所有的接口以后统一导出,然后就能通过router中的url来访问了。

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

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

相关文章

‘wget‘ 不是内部或外部命令,也不是可运行的程序

在Windows环境下创建了虚拟环境并安装了wget包,但在使用该命令的时候仍然报错,‘wget’ 不是内部或外部命令,也不是可运行的程序 解决方案: 去官网下载对应位数的.exe文件,将其放在C:\Windows\System32目录下即可, 别下错版本&a…

C语言-预处理详解

文章目录 🎯引言👓预处理详解1.预定义符号1.1 __FILE__1.2 __LINE__1.3 __DATE__1.4 __TIME__1.5 __STDC__ 2.#define定义常量2.1 定义数值常量2.2 定义字符串常量 3.#define中使用参数3.1**使用示例**3.2注意事项 4.宏替换的规则5.宏函数和函数的对比5.…

windows远程连接virtualbox的ubuntu问题

一.安装vritualbox ubuntu,18、22版本比较稳定 1.推荐使用ubuntu22版本 2.ubuntu24对内存要求较高至少4G,时不时会死机,安装老是崩溃,恢复不了,如果电脑性能强悍那可以尝试。 3.ubuntu18 对vscode最高只能支持1.85.…

Spring中的工厂模式详解及应用示例

1. Spring中的BeanFactory BeanFactory是一个接口,表示它是一个工厂,负责生产和管理bean。在Spring中,BeanFactory是IOC容器的核心接口,定义了管理Bean的通用方法,如 getBean 和 containsBean。 BeanFactory与IOC容器…

海外视频媒体发布/发稿:如何在国外媒体以视频的形式宣发

1. 背景介绍 在如今数字化时代,每个国家都拥有着各自的视频媒体平台,而主流媒体也都纷纷加入了视频发布的行列。视频媒体的宣发形式主要包括油管Youtube等视频分享平台,以及图文配合的发布方式。通过在视频中夹带链接,媒体可以以…

C++ 宏和内联、范围for、nullptr

C 宏函数和内联函数、范围for、nullptr 宏函数和内联函数 ​ 函数重载中提到过,一个程序编译需要经过四个阶段,第一个阶段预处理中有一个操作是宏替换。由于是替换,所以宏不建立栈帧,且没有数据类型的限制,能够提高我…

CCSI: 数据无关类别增量学习的持续类特定印象| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 CCSI: Continual Class-Specific Impression for data-free class incremental learning CCSI: 数据无关类别增量学习的持续类特定印象 01 文献速递介绍 当前用于医学影像分类任务的深度学习模型表现出令人鼓舞的性能。这些模型大多数需要在训练之前收集所有的…

element plus 实现跨页面+跨tab栏多选

文章目录 element plus 层面数据层面 菜鸟好久没写博客了,主要是没遇见什么很难的问题,今天碰见了一个没有思路的问题,解决后立马来和大家伙分享了! 菜鸟今天要实现一个需求,就是:实现跨页面跨 tab栏 多选…

解锁算力新极限,Xilinx UltraScale+赋能的高性能低延时FPGA加速卡

01、产品概述 AiHPC-V9P 是一款基于 AMD Virtex UltraScale FPGA VU9P 的 PCIe Gen3.0 x16 接口智能网卡,具有最大2*200GbE /或者16*10GbE(典型应用)接入容量的高性能低延时智能网卡。 对外接口支持两组QSFP-DD 最高25Gb/s x8Lane 光口接入&#xf…

《梦醒蝶飞:释放Excel函数与公式的力量》10.4 IMREAL函数

第四节 10.4 IMREAL函数 10.4.1 函数简介 IMREAL函数是Excel中的一个工程函数,用于提取复数的实部。在复数运算中,实部是复数的一部分,表示没有虚部参与的部分。IMREAL函数提供了一个简单的方法来获取复数的实部,便于进一步计算…

Docker 使用基础(2)—镜像

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 4:20 🔄 ◀️ ⏸ …

linux下安装cutecom串口助手;centos安装cutecom串口助手;rpm安装包安装cutecom串口助手

在支持apt-get的系统下安装 在终端命令行中输入: sudo apt-get install cutecom 安装好后输入 sudo cutecom 就可以了 关于如何使用,可以看这个https://www.cnblogs.com/xingboy/p/14388610.html 如果你的电脑不支持apt-get。 那我们就通过安装包…

7.10号小项目部分说明

总体说明 糖锅小助手 我这次主要对上次糖锅小助手界面添加了一个侧边栏(侧边输入框放置了三个按钮,可以跳转到其他ai聊天界面,还可以退出聊天界面回到登录界面)和一个日期输入框(日期输入框获取时间,根据时…

常见摄像头模块性能对比

摄像头模块在现代电子设备与嵌入式开发中扮演着重要角色,从智能手机到安全监控系统,再到机器人视觉系统,它们无处不在。以下是一些常见的摄像头模块及其特点的对比: OV2640 分辨率:最高可达200万像素(1600x…

GPT-4o不香了, Claude3.5 Sonnet来了,直接免费可用

大家好!我是YUAN。 刚刚! AI领域又迎来了一场新的风暴——Anthropic公司发布了全新的Claude 3.5 Sonnet模型,这一消息如同一颗重磅炸弹,震撼了整个科技界。 Claude 3.5 Sonnet与GPT-4o对比 性能飞跃:超越GPT-4o Cl…

SA8317E单通道 2.7-15.0V 持续电流 2.5A H 桥驱动芯片

描述 SA8317E 是为消费类产品,小家电和其他 低压或者电池供电的运动控制类应用提供 了一个集成的电机驱动器解决方案。此器 件能够驱动一个直流电机,由一个内部电 荷泵生成所需的栅极驱动电压电路和 4 个 功率 NMOS 组成 H 桥驱动,集成了电…

01 企业网站架构部署与优化之Apache配置与应用

目录 3.1 Apache连接保持 3.2 Apache的访问控制 3.2.1 客户机地址限制 3.2.2 用户授权限制 1. 创建用户认证数据文件 2. 添加用户授权配置 3. 验证用户访问授权 3.3 Apache日志分割 1. Apache自带rotatelogs分割工具 2. 使用第三方工具cronolog 3.4 AWStats日志分析 3.4.1 …

ns3学习笔记(四):路由概述

基于官网文档的 Routing Overview 部分详细研究一下ns3中路由是怎么工作的 文档链接16.4. Routing overview — Model Library 一、概述 NS3整体的工作架构如下: 路由部分的工作架构如下: 路由部分目前大多数用到的算法都包含在Ipv4RoutingProtocol部分…

【排序 - 插入排序 和 希尔排序】

插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是逐步构建有序序列。在排序过程中,它将未排序的元素逐个插入到已排序的部分中,从而在每次插入时扩展已排序序列的长度。 原理介绍 插入排序的基本思…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验17 开放最短路径优先OSPF

一、实验目的 1.验证OSPF协议的作用; 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.验证OSPF协议的作用。 四、实验步骤 1.构建网…