【后端开发实习】用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来访问了。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 11:24:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 11:24:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 11:24:04       58 阅读
  4. Python语言-面向对象

    2024-07-11 11:24:04       69 阅读

热门阅读

  1. C++ 字符串哈希(hush)讲解

    2024-07-11 11:24:04       21 阅读
  2. 玩转springboot之SpringBoot单元测试

    2024-07-11 11:24:04       24 阅读
  3. 使用 Nuxt 3 搭建国际官网

    2024-07-11 11:24:04       19 阅读
  4. kafka-3

    kafka-3

    2024-07-11 11:24:04      18 阅读
  5. 华为机试HJ84统计大写字母个数

    2024-07-11 11:24:04       20 阅读
  6. MySQL中in和exists的区别

    2024-07-11 11:24:04       20 阅读
  7. Spring Boot 常用 Starter

    2024-07-11 11:24:04       22 阅读
  8. dify/api/models/tool.py文件中的数据表

    2024-07-11 11:24:04       22 阅读
  9. 【SQL】InnoDB的意向锁

    2024-07-11 11:24:04       24 阅读