【后端开发实习】用Nodejs操作mongodb结合Mongoose实现数据库操作

news2024/9/27 12:14:42

用Nodejs操作mongodb结合Schema实现数据库操作

  • Mongoose
    • 创建Schema
    • 定义Schema对象并映射到数据库
    • Model的使用
      • 创建文档内容
      • 删除文档内容
      • 修改文档内容
      • 查询文档内容
    • Document的使用
      • 创建并保存
      • 将文档对象转换为JSON对象
    • 模块化
      • 数据库连接
      • 模型初始化
  • 项目部署
    • 路由定义
    • 后端操作定义
    • 启动服务

Mongoose

Mongoose是一个第三方的用于操作mongodb的库,与之前一篇文章中直接使用原生的由mongodb提供的CURD来直接操作数据库不同,在Mongoose中提供了更高层的抽象,增加了自动检查的机制。其主要结构如下:
Schema在node.js中的mongoose库中,主要作用是作为一个模板,通过这个模板可以映射到数据库和数据表。同时在Schema下面一个层级还有Model,通过Model可以创建一个数据文档对象,通过这个对象就可以实现对数据库的增删改查操作。

创建Schema

var productSchema = new Schema({
	name:String,
	type:String,
	price:Number,
	innum:Number,
	indate:Date,
	outnum:Number,
	{
        type: Date,
        default: Date.now
    }
})

定义Schema对象并映射到数据库

var productmodel = mongoose.model("product", productSchema);

Model的使用

创建文档内容

Model.create(doc(s),[callback])
  • doc:文档对象,可以一次性传入多个对象。
  • callback:回调函数,返回新增的内容。

删除文档内容

//删除所有符合条件
Model.remove(conditions, [callback])
//删除一条记录
Model.deleteOne(conditions, [callback])
//删除多条记录
Model.deleteMany(conditions, [callback])
  • conditions:删除对象匹配条件
  • callback:回调函数。

修改文档内容

//更新所有符合条件
Model.update(conditions, doc, options, callback) 
//更新多条符合条件
Model.updateMany(conditions, doc, options, callback) 
//更新一条
Model.updateOne(conditions, doc, options, callback) 
  • conditions:修改对象匹配条件
  • doc:修改以后的内容,如果需要不是覆盖修改,则需要添加$set字段用于约束。
  • options:修改选项,用来传multi参数,一般情况用不上。
  • callback:回调函数

查询文档内容

//查询所有符合条件的文档
Model.find(conditions, [projection], [options], [callback])
//根据文档的id属性查询文档
Model.findByID(id, [projection], [options], [callback])
//查询符合条件的第一个文档
Model.findOne([conditions], [projection], [options], [callback])
  • conditions:表示查询的条件,可以加上{name:“张三”}用来查询张三相关的数据字段。
  • projections:表示投影,可以设置投影实现仅查询返回部分字段的内容。比如可以设置**{name:1,_id:0}表示仅返回名字字段不返回_id字段;同样的也能通过字符串的形式进行限制,如"name -_id",条件之间加上空格,另外负号表示不返回**。
  • options:查询选项,比如skip,limit,可以通过这个功能实现分页操作
  • callback:回调函数,将查询的结果返回,格式是数组

Document的使用

创建并保存

//创建一个文档,直接实例化一个model就可以实现
var prodoc = new productmodel({
	name:"旺仔",
	type:"食品",
	price:6,
	innum:100,
	indate:2023-04-05,
	outnum:20,
	outdate:2023-04-08
})
prodoc.save(function(err)){
	if(!err){
	console.log("数据添加成功!");
	}
}

将文档对象转换为JSON对象

在向用户显示数据的时候会遇到想要只向用户展示一部分的数据字段而不想展示所有的数据字段的情况,同时还不想删除数据库中的内容,这时候就需要将文档对象转换成JSON,变成一个单独用来存储数据的格式。需要注意的是转换以后Document相关的方法都没法使用了。

doc = doc.toObject()
//删除数据对象中的price字段
Delete doc.price;

模块化

数据库连接

新建一个connection.js的文件用于封装连接数据库的操作

const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1/shop");
mongoose.connection.once("open",function() {
console.log("数据库连接成功~~~");
});

再别的文件中只需要:

require("./tools/connection")

就可以实现连接,而不用每次连接都要在代码前面写这么长一串内容。

模型初始化

创建models文件夹,然后创建一个名称为product的js文件,如果有需要仅仅需要在这个文件夹下面继续新建模块就可以了。

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

var productSchema = new Schema({
	name:String,
	type:String,
	price:Number,
	innum:Number,
	indate:Date,
	outnum:Number,
	outdate:{
        type: Date,
        default: Date.now
    }
});

var productmodel = mongoose.model("product",productSchema);

//将上述代码导出为模块
module.export = Productmodel;

在其他的文件中只需要以下代码就可以调用:

const product = require("./models/product")

项目部署

在这里插入图片描述

路由定义

const express = require("express");
const router = express.Router();

const operation = require("../tools/opra");

const { ObjectId } = require("mongodb");
//新增数据
router.post("/add",async(req,res)=>{
	let result = await operation.insert([{
	"name": "taddy",
	"type":"toy",
    "price": 15,
    "innum":20,
	"indate":new Date("October 13, 2023 11:13:00"),
	"outnum":13,
	"outdate":new Date("October 13, 2023 15:13:00")
	}])
	res.send("数据新增成功!" + result);
})
//删除数据
router.delete("/:name", async(req, res)=>{
	try {
		var name = req.params;
		var result = await operation.remove({name:name});
		res.send("删除成功");
		return result;
	} catch (err) {
		res.send(err);
	}
})
//修改数据
router.put("/:name",async(req,res)=>{
	var name = req.params;
	var newdata = req.body;
	try{
		let result = await operation.update({name:name},newdata);
		res.send("数据修改成功");
		return result;
	}catch (err) {
		res.send("数据修改失败")
	}
})
//查询数据
router.get("/search/:name", async(req, res)=>{
	let name = req.params;
	var projection = "name -_id type price innum outnum indate outdate";
	var result = await operation.search({name:name},projection,function(err){
		if(!err){
			console.log("查询成功!");
		}else{
			console.log(err);
		}
	})
	return result;
})

//汇总数据
module.exports = router;

后端操作定义

require("./connections");
const product = require("../models/product");

//增操作
async function insert(doc){
	product.create(doc,function(err){
		if(!err) {
			console.log("数据插入成功");
		}else{
			console.log(err);
		}
	})
}

//删操作
async function remove(query){
	product.remove(query,function(err){
		if(!err) {
			console.log("删除成功!");
		}else{
			console.log(err);
		}
	})
}
//改操作
async function update(query, newdata){
	product.update(query, newdata,function(err){
		if(!err) {
			console.log("数据更新成功");
		}else{
			console.log(err);
		}
	})
}
//查操作
async function search(query,projection){
	result = product.find(query,projection,function(err){
		if(!err) {
			console.log("查询成功");
		}else{
			console.log(err);
		}
	})
	return result;
}
//数据汇总
async function sumup(){
	//调用aggregate方法
	
}

module.exports = {
	insert,
	remove,
	update,
	search,
	sumup
}

启动服务

const express = require("express")

const app = new express()
const router = require("./router/router")

app.use("/",router)

app.listen(80, ()=>{
	console.log("server running on localhost")
})

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

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

相关文章

19185 01背包问题

解决这个问题的关键是使用动态规划的方法。我们可以创建一个二维数组dp[i][j],其中i表示考虑前i件物品,j表示背包的容量。dp[i][j]的值表示在考虑前i件物品,且背包容量为j时能获得的最大价值。 ### 算法步骤 1. 初始化一个二维数组dp&#x…

Qt Design Studio 4.5现已发布

Qt Design Studio现已强势回归,生产力和可用性均得到大幅提升。无论是直观的3D编辑界面,还是与Figma和Qt Creator的无缝连接,新版Qt Design Studio将为您带来更好的产品开发体验。快来深入了解Qt Design Studio的全新功能吧! 为3…

uniapp实现table排序

根据后端接口传来的数字大小对列表进行升序/降序展示 效果图,价格由高到低降序 价格由低到高 升序 js 降序升序代码如下 export default {data() {return {MtList:[]}},onLoad() {this.MtypeName();//加载列表方法},methods: {MtypeName(){//列表方法this.$api.…

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括: ❑ 封面; ❑ 文档修订记录表; ❑ 目录; ❑ 引言; ❑ 产品概述:产品结构图 ❑ 详细需求说明:产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…

地理信息科学在交通规划中的应用:GIS绘制智慧出行新蓝图

在当代城市化迅猛发展的背景下,交通规划面临着前所未有的挑战与机遇。作为地理信息与遥感领域的研究者,我深感地理信息科学(GIS)在解决这些问题时扮演着无可替代的角色。本文将深入探讨GIS如何在交通网络分析和优化中发挥核心作用…

netscaler LDAP+RADIUS传统的双因素认证方式(之一)

如果使用传统的双因素认证方式,可以通过在Citrix ADC (NetScaler) 13.1上配置Gateway Virtual Server来实现LDAP和RADIUS的双因素认证。当前配置方式,采用Cateway vServer两个Basic Authtication Policy方式实现,以下是详细步骤: …

蜂窝互联网接入:连接世界的无缝体验

通过Wi—Fi,人们可以方便地接入互联网,但无线局域网的覆盖范围通常只有10~100m。当我们携带笔记本电脑在外面四处移动时,并不是在所有地方都能找到可接入互联网的Wi—Fi热点,这时候蜂窝移动通信系统可以为我们提供广域…

【趣味数学】求阴影部分面积

题 解法1: 中位线法 既然是中点,就可以用起来,横着不行,竖着来,扩展做辅助线 E是中点S(AED) 1/4 S(ABCD) 6 做图中辅助延长线,因为E中点,所以S(MEB)S(AED) 6 同理E也是…

element el-table实现表格动态增加/删除/编辑表格行,带校验规则

本篇文章记录el-table增加一行可编辑的数据列,进行增删改。 1.增加空白行 直接在页面mounted时对form里面的table列表增加一行数据,直接使用push() 方法增加一列数据这个时候也可以设置一些默认值。比如案例里面的 产品件数 。 mounted() {this.$nextTi…

学习通er图和项目思路

ER图 项目构思: 用户功能: 主要功能逻辑:

计算机是如何工作的 (程序猿基础知识)

文章目录 1.计算机的发展史2. 冯诺依曼体系 (Von Neumann Architecture)冯诺依曼简介 (计算机的祖师爷) 3. CPU基本工作流程3.1 逻辑门3.2 门电路(Gate Circuit)3.3 算数逻辑单元 ALU (Arithmetic & Logic Unit)3.3.1 进制的理解3.3.2 算数单元(Arithmetic Unit)3.3.3 逻辑…

【错题集-编程题】买卖股票的最好时机(四)(动态规划)

力扣对应题目链接:188. 买卖股票的最佳时机 IV - 力扣(LeetCode) 牛客对应题目链接:买卖股票的最好时机(四)_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 1、状态表示 为了更加清晰的区分买入和卖出,我们换成有股…

【从零开始实现stm32无刷电机FOC】【实践】【4/6 stm32高级定时器】

点击查看本文开源的完整FOC工程 在完成理论方面的准备后,是可以进行写代码实现了,但是stm32单片机提供了不少可以用于电机控制的硬件外设,充分利用这些硬件资源,可以减少代码量以及提高运行性能。 本文使用的stm32型号为喜闻乐见的…

天环公益首发原创开发进度网站 带后台

天环公益计划首发原创开发进度网站 带后台 后台地址是:admin.php 后台没有账号密码 这个没有数据库 有能力的可以自己改 源码下载:https://download.csdn.net/download/m0_66047725/89520358 更多资源下载:关注我。

位图 、Max Sum、滑动窗口

这篇博客主要总结一下,这两天刷的算法题: 判断字符是否唯一 题目意思很简单不再解读,拿到这道题,其实不难看出哈希表可以直接秒了,注意这是一道面试题,在oj上可以哈希表秒了,如果面试官要求不使…

如何连接到公司的服务器?

1.下载FileZilla FileZilla的下载与安装以及简单使用(有图解超简单)-CSDN博客 2.打开 3.输入主机 用户名 密码 端口 注:主机支持的协议类型: 4.连接成功 其他方式也有很多,比如通过cmd,html网页等等 3个…

Apache Doris + Apache Hudi 快速搭建指南|Lakehouse 使用手册(一)

作者:SelectDB 技术团队 导读:湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中,Apache Doris…

下载动画人物

1、网址:动画 2、点击Characters 3、搜索人物 4、点击弹出的人物,弹出对话框选择USE THIS CHARACTER 5、下载 6、点击Animations,搜索walk 7、点击UPLOAD CHARACTER,看到男孩步行,选择In Place,点击下载&…

浅谈后置处理器组件提取器相关的Apply to

浅谈后置处理器组件提取器相关的Apply to 在Apache JMeter中,“提取器”(通常指的是正则表达式提取器、JSON路径提取器或CSS/JQuery提取器等)是用来从服务器响应中提取信息的重要组件。这些信息可以是cookies、session IDs、特定的文本或者任…

作业一:ER图 作业:二QQ项目思路 作业三:实现QQ的登录与注册界面

一、ER图 二、QQ项目思路:客户端功能,服务器端功能的实现 1.登录注册: 将基本信息如手机号码,验证码,还有已有的账号及账号相关信息等存入数据库中,登录方式为账号密码登录,还有忘记密码用邮箱…