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

news2024/9/24 13:26:24

用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); //ok
  
	try {
	  let result = await mongo.updata(colc_name, whereDate, updataDate);
	  res.send("success");
	} catch (err) {
	  res.send("fail")
	}
  })
module.exports = router;

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

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

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

相关文章

德语中含“Augen”的惯用语表达-柯桥小语种学习德语考级

在我们的德语学习过程中,除了词汇的记忆,另一项重要的记忆任务就是惯用语的背诵啦。要知道,德语中有大量的Redewendung,他们以其言简意赅的表达,在日常用语中备受青睐。上一期我们已经学习了部分含有“Hand”的惯用语&…

每日一题~abc356(对于一串连续数字 找规律)

添加链接描述 题意:对于给定的n,m 。计算0~n 每一个数和m & 之后,得到的数 的二进制中 1的个数的和。 一位一位的算。最多是60位。 我们只需要计算 在 1-n这些数上,有多少个数 第i位 为1. 因为是连续的自然数,每一位上1 的…

ARM学习(29)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择

ARM学习(28)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择 1、多种启动方式介绍 IMX1166 支持多组flexSPI 引脚启动,FlexSPI1以及FlexSPI2,通过boot cfg可以切换FlexSPI得实例。 每个实例又支持多组引脚,总共…

Let‘s Encrypt性价比最高的申请SSL证书

SSL/TLS证书作为确保网站数据传输安全性的重要手段,受到了广大网站运营者的青睐。然而,高昂的证书费用往往成为许多小型网站和个人博客的负担。 申请Lets Encrypt免费泛域名SSL证书步骤 1. 登录来此加密网站,输入域名,可以勾选泛…

食物链之带权并查集解法

直接看题&#xff1a;https://www.acwing.com/problem/content/description/242/ 下面就是代码的实现了&#xff0c;因为自己与自己肯定是同类我们初始化为0. 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,k; int fk,x,y; int fa[10001…

染色法判定二分图

什么是二分图&#xff1f; 二分图&#xff0c;也称作二部图&#xff0c;是图论中的一种特殊模型。在一个无向图G(V,E) 中&#xff0c;如果顶点集合 V 可以被分割成两个互不相交的子集 A 和 B&#xff0c;并且图中的每条边 (i,j) 关联的两个顶点 i 和 j 分别属于这两个不同的顶…

第三课网关作用

实验拓扑图&#xff1a; 基础配置&#xff1a; PC1的基础配置 PC2的基础配置&#xff1a; PC4的基础配置 AR1添加PC4网段: 并且添加pc1,pc2的网段。 并且添加pc1,pc2的网段。 原理&#xff1a;PC4先把数据交给100.100.100.1&#xff0c;交给了路由器&#xff0c;路由器再把数…

分贝通差旅管理费控BI 助力企业差旅报销降本

在企业的日常运营中&#xff0c;每张机票、每个酒店预订、每次用车、每笔对公付款&#xff0c;这些看似零碎的支出累积起来&#xff0c;每月往往能轻松达到数百万元。面对如此庞大的支出&#xff0c;如何及时发现并控制不合理支出&#xff0c;成为企业成本控制的关键。为此&…

引用计数器(kref)

1、什么是引用计数器 如果我们写了一个字符驱动&#xff0c;当硬件设备插上时&#xff0c;系统会生成一个设备节点。用户在应用空间操作这个设备节点就可以操作设备。如果此时将硬件断开&#xff0c;驱动是不是就要立刻释放呢&#xff1f;如果立刻释放&#xff0c;应用程序是不…

计算机网络体系结构解析

OSI参考模型 与 TCP/IP模型 如图所示 TCP/IP模型有几层 应用层&#xff1a;只需要专注于为用户提供应用功能 HTTP、SMTP、Telnet等&#xff0c;工作在操作系统中的用户态&#xff0c;传输层及以下工作在内核态传输层&#xff1a;为应用层提供网络支持&#xff08;TCP、UDP传…

《昇思25天学习打卡营第01天|qingyun201003》

打卡 日期 心得 我的主语言并不是Python,以及现在从事的工作也并不是开发&#xff1b;所以对于这个系列的课程&#xff0c;学习起来是较为困难的&#xff0c;所以基于这种情况&#xff0c;该如何进行学习&#xff1f;我的做法是全部交给AI&#xff0c;使用AI一步步解析代码&a…

xcode配置swift使用自定义主题颜色或者使用RGB或者HEX颜色

要想在xcode中使用自定义颜色或者配置主题色&#xff0c;需要在Assets中配置&#xff0c;打开Assets文件&#xff0c;然后点击添加Color Set&#xff1a; 输入颜色的名称&#xff0c;然后选中这个颜色&#xff0c;会出现两个颜色&#xff1a; Any Appearance表示亮色模式下使用…

JRT打印药敏报告

最近没写jrt系列博客&#xff0c;不是中途而废了。而是在写微生物系统。今天终于把微生物大体完成了&#xff0c;伴随着业务的实现&#xff0c;框架趋于完善和稳定。构建一套完美而强大的打印体系一直是我的理想&#xff0c;从最开始C#的winform打印控件到刚接触bs时候用js打印…

react学习——24redux实现求和案例(精简版)

1、目录结构 2、count/index.js import React, {Component} from "react"; //引入store,用于获取数据 import store from ../../redux/store export default class Count extends Component {state {count:store.getState()}componentDidMount() {//监测redux中的…

手撸俄罗斯方块(一)——简单介绍

手撸俄罗斯方块 简单介绍 《俄罗斯方块》&#xff08;俄语&#xff1a;Тетрис&#xff0c;英语&#xff1a;Tetris&#xff09;&#xff0c;是1980年末期至1990年代初期风靡全世界的电脑游戏&#xff0c;是落下型益智游戏的始祖&#xff0c;电子游戏领域的代表作之一&a…

关于气象探测设备的介绍

气象探测设备概述 气象探测设备是用于收集、记录和分析大气环境信息的专用工具。它们能够实时监测气温、湿度、气压、风速、风向、降雨量等多种气象要素&#xff0c;为天气预报、气候研究、农业生产和环境保护等领域提供重要数据支持。气象探测设备种类繁多&#xff0c;包括地…

【UML用户指南】-33-对体系结构建模-系统和模型

目录 1、系统和子系统 2、模型和视图 3、跟踪 4、常用建模技术 4.1、对系统的体系结构建模 4.2、对系统的系统建模 模型是对现实世界的简化——即对系统的抽象&#xff0c;建立模型的目的是为了更好地理解系统。 1、系统和子系统 一个系统可能被分解成一组子系统&#…

MySQL超详细学习教程,2023年硬核学习路线

文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务 2.3 MySQL登录和退出2.4 MySQL卸载2.…

推荐3款电脑必备专业软件,错过拍大腿

SolveigMM Video Splitter SolveigMM Video Splitter是一款功能强大的视频编辑工具&#xff0c;主要用于视频的无损剪切和合并。该软件支持多种常见的视频格式&#xff0c;如AVI、WMV、ASF、MP3、WMA等。此外&#xff0c;它还支持AVCHD、MPEG-2、WebM、FLV等格式&#xff0c;并…

论文 | REACT: SYNERGIZING REASONING AND ACTING INLANGUAGE MODELS

本文首先认为&#xff0c;到目前为止&#xff0c;LLM 在语言理解方面令人印象深刻&#xff0c;它们已被用来生成 CoT&#xff08;思想链&#xff09;来解决一些问题&#xff0c;它们也被用于执行和计划生成。 尽管这两者是分开研究的&#xff0c;但本文旨在以交错的方式将推理…