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

用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")
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索大模型:袋鼠云在 Text To SQL 上的实践与优化

Text To SQL 指的是将自然语言转化为能够在关系型数据库中执行的结构化查询语言(简称 SQL)。近年来,伴随人工智能大模型技术的不断进步,Text To SQL 任务的成功率显著提升,这得益于大模型的推理、理解以及指令遵循等能…

智能未来已来:纷享AI携手企业共赴AI+CRM新征途

大模型的风潮席卷各类型应用,“AI CRM”的概念并不算新,但真正好用、能用在业务流程中的AI工具并不多,而客户关系和旅程的复杂性不断变化,业务团队的压力不断增加,买家期望不断增高,这些都在推动CRM的人工智…

在Ubuntu下安装samba实现和Windows系统文件共享

一、安装 apt install -y samba samba-clientSamba is not being run as an AD Domain Controller: Masking samba-ad-dc.service Please ignore the following error about deb-systemd-helper not finding those services. (samba-ad-dc.service masked) Created symlink /et…

确保智慧校园安全,充分利用操作日志功能

智慧校园基础平台系统的操作日志功能是确保整个平台运行透明、安全及可追溯的核心组件。它自动且详尽地记录下系统内的每一次关键操作细节,涵盖操作的具体时间、执行操作的用户账号、涉及的数据对象(例如学生信息更新、课程调度变动等)、操作…

Facebook的未来蓝图:从元宇宙到虚拟现实的跨越

随着科技的不断演进和社会的数字化转型,虚拟现实(VR)和增强现实(AR)作为下一代计算平台正逐渐走进人们的视野。作为全球领先的科技公司之一,Facebook正在积极探索并推动这一领域的发展,以实现其…

跑分器(made in 蒟蒻)(内附代码)

#题外话:这里也能免费获取代码,不用买会员:洛谷剪贴板 #直逼正文: 最近看到这个东西…… 据说它有个跑分功能,想逝逝。 但…… 所以我决定,用自己编一个低端的…… #思路 感觉跑分就是测试中央处理器的…

鸿蒙语言基础类库:【@ohos.worker (启动一个Worker)】

启动一个Worker 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Work…

棋牌室计时收费系统怎么接电源线 佳易王棋牌计时灯控版管理系统教程

前言: 棋牌室计时收费系统怎么接电源线 佳易王棋牌计时灯控版管理系统教程 以下软件操作教程以,佳易王棋牌计时计费管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件操作教程 1、软件在点击计时按钮…

【Linux】常见指令收官权限理解

tar指令 上一篇博客已经介绍了zip/unzip指令,接下来我们来看一下另一个关于压缩和解压的指令:tar指令tar指令:打包/解包,不打开它,直接看内容 关于tar的指令有太多了: tar [-cxtzjvf] 文件与目录 ...…

怎样在 C 语言中进行结构体的内存布局控制?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代&…

Doris安装部署

Doris安装部署 1、 MPP概念Doris简要介绍 1、 MPP概念 MPP (Massively Parallel Processing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点…

免费录制视频的软件,推荐3款,总有一款适合你!

在数字化时代,视频录制与分享已成为日常生活和工作中的重要组成部分。无论是录制游戏过程、教程讲解还是网络会议,一款好用的录制视频软件能够帮助我们更便捷地实现这个目标。然而,许多录制视频的软件都是收费的,这对于很多人来说…

定时器TIM配置微妙延时函数

定时器TIM配置微妙延时函数 文章目录 定时器TIM配置微妙延时函数开胃小菜(BOOT0、BOOT1)Boot0Boot1(如果有) 三种定时器高级控制定时器(TIM1,TIM8)通用定时器(TIM2, TIM3, TIM4, TIM…

dxf数据结构

DXF(Drawing Exchange Format,绘图交换格式)是Autodesk公司开发的一种CAD(计算机辅助设计)文件格式,用于实现AutoCAD与其他软件之间的CAD数据交换。DXF格式文件是一种开放的矢量数据格式,具有多…

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~ 文章目录 怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~0. 在开始清理之前1. 推荐执行的操作1.1 清理系统缓存文件1.2 磁盘清…

爱秀国际英语公信力怎么样?靠谱吗?

同爱秀国际英语公信力怎么样? ①爱秀国际英语成立于09年,已经有15年的教学积累,专门针对大学生研发的英语口语课程。 ②历年来不仅教学效果显著,在社会上也获得过很多荣誉,在历年的教育大会上也荣获过诸多认可&…

maven私有镜像仓库nexus部署使用

maven私有镜像仓库nexus部署使用 1、Nexus部署 #查找镜像 docker search sonatype/nexus3 #拉取镜像 docker pull sonatype/nexus3 #持久化目录 mkdir -p /data/nexus/data chmod 777 -R /data/nexus/data #启动服务 docker run -d --name nexus3 -p 8081:8081 --restart alw…

创建React 项目的几种方式

①.react自带脚手架 使用步骤: 1、下载 npm i create-react-app -g 2、创建项目命令: create-react-app 项目名称 ②.Vite构建工具创建react步骤:(推荐) 方法一: 1、yarn create vite 2、后续根据提示步…

新书速览|Vue.js 3.x+Express全栈开发:从0到1打造商城项目

《Vue.js 3.xExpress全栈开发:从0到1打造商城项目》 1 本书内容 《Vue.js 3.xExpress全栈开发 : 从0到1打造商城项目》是一本详尽的全栈开发教程,旨在通过Vue.js和Express框架引导读者从零开始构建一个完整的电商项目。内容覆盖电商项目的基本结构&…