Node.js详解(四):连接MongoDB

news/2024/12/28 22:45:50/

文章目录

  • 一、安装MongoDB访问驱动
  • 二、连接数据库
  • 三、添加数据
  • 四、添加多条数据
  • 五、修改数据
  • 六、查询数据
    • 1、查询单条记录
    • 2、查询多条记录
  • 七、删除数据
  • 八、完整示例代码
    • 1、路由 Api 接口:
    • 2、运行结果:

MongoDB 对许多平台都提供驱动可以访问数据库,如C#、Java、Node.js等。下面一步一步带着大家在Nodejs中连接MongoDB

在这里插入图片描述

一、安装MongoDB访问驱动

命令如下:

全局安装驱动:npm install mongodb -g在当前项目中引入:npm install mongodb --save

二、连接数据库

const { MongoClient } = require("mongodb");  //导入依赖对象mongo客户端let url="mongodb://127.0.0.1:27017";  //数据库连接字符串let client=new MongoClient(url);  //实例化一个mongo客户端async function run(){try{await client.connect();  //连接await client.db("nfit").command({ping:1});  //向数据库nfit发送命令console.log("连接数据库成功!");}finally{await client.close();}
}run().catch(console.log);

三、添加数据

const { MongoClient } = require("mongodb");  //依赖MongoClientlet client=new MongoClient("mongodb://127.0.0.1:27017");  //实例化一个客户端async function run(){try{let db=await client.db("nfit");  //获取数据库let students=await db.collection("students");  //获取集合,表let doc={id:202201,name:"tom",age:19};  //将添加的数据对象let result=await students.insertOne(doc);  //执行向数据库中添加数据并等待响应结果console.log(result);}finally{await client.close();  //关闭数据库}
}run().catch(console.log);

四、添加多条数据

const { MongoClient } = require("mongodb");  //依赖MongoClientlet client=new MongoClient("mongodb://127.0.0.1:27017");  //实例化一个客户端async function run(){try{let db=await client.db("nfit");  //获取数据库let students=await db.collection("students");  //获取集合,表let docs=[{id:202202,name:"rose",age:17},{id:202203,name:"mark",age:18}];  //将添加的数据对象let result=await students.insertMany(docs);  //执行向数据库中添加数据并等待响应结果console.log(result);}finally{await client.close();  //关闭数据库}
}run().catch(console.log);

五、修改数据

const { MongoClient } = require("mongodb");
let client=new MongoClient("mongodb://127.0.0.1:27017");async function run(){try{let db=await client.db("nfit"); //获取数据库let students=await db.collection("students");  //获取集合let filter={id:202201};  //要更新的数据的过滤条件let result=await students.updateOne(filter,{$set:{name:"汤姆"}});  //执行更新单条数据console.log(result);}finally{await client.close();  //关闭}
}run().catch(console.log);

六、查询数据

1、查询单条记录

const { MongoClient } = require("mongodb");
let client=new MongoClient("mongodb://127.0.0.1:27017");async function run(){try{let db=await client.db("nfit"); //获取数据库let students=await db.collection("students");  //获取集合let filter={id:202201};  //过滤条件let obj=await students.findOne(filter);  //根据过滤条件查找单条数据console.log(obj);}finally{await client.close();  //关闭}
}run().catch(console.log);

2、查询多条记录

const { MongoClient } = require("mongodb");
let client=new MongoClient("mongodb://127.0.0.1:27017");async function run(){try{let db=await client.db("nfit"); //获取数据库let students=await db.collection("students");  //获取集合let query={id:{$gte:202201}};  //查询条件是id大于等于202201let cursor=await students.find(query);  //执行查询并返回游标对象let result=[];  //学生数组,返回包装用await cursor.forEach(data=>result.push(data));  //遍历游标,取出数据console.log(result);}finally{await client.close();  //关闭}
}run().catch(console.log);

七、删除数据

const { MongoClient } = require("mongodb");
let client=new MongoClient("mongodb://127.0.0.1:27017");async function run(){try{let db=await client.db("nfit"); //获取数据库let students=await db.collection("students");  //获取集合let filter={id:202201};  //要删除的数据的过滤条件let result= await students.deleteOne(filter);  //执行删除console.log(result);}finally{await client.close();  //关闭}
}run().catch(console.log);

八、完整示例代码

连接MongoDB数据库,实现curd、图片上传(使用element-ui框架)功能的完整代码如下:

1、路由 Api 接口:

// 导入模块
var express = require('express');
var router = express.Router();
var _ = require("lodash");
var path = require("path");
var multer = require('multer');// 图片上传
// 文件上传的内置方法
var imgName = ""; // 这个是保存在路径里的名称
const storage = multer.diskStorage({// 文件存储路径destination(req, file, callback) {// 上传的图片放到本地的文件夹里面let imgUrl = "E:/qd/11. node.js/练习/test05_mongoDB/public/images"// 回调函数callback(null, imgUrl)},filename(req, file, callback) {// 后缀名,到时候添加数据的时候,先把它设为空,然后进入图片上传页,然后做修改的操作imgName = _.random(0, 9999999999999) + path.extname(file.originalname);callback(null, imgName); // 把生成的名称放在这里}
});// 也是内置函数
const addfild = multer({storage
});// 连接数据库
const {MongoClient,ObjectId
} = require("mongodb");let url = "mongodb://127.0.0.1:27017";let client = new MongoClient(url);// 传参数:需要的数据,i(如果它为1,就查询,2就添加...),res:返回给客户端的数据
async function run(bookDate, i, res, req) {try {await client.connect();let db = await client.db("book"); // 连接数据库的let book = db.collection("bookInfo"); // 连接集合的let result = ""; // SQL语句// 执行哪个执行语句    if (i == 1) {result = await book.find().toArray(); // 查询所有数据的}if (i == 2) {// 获取图书编号let id = parseInt(req.params.id);// 查看id是什么类型的console.log(typeof id);// 执行语句result = await book.deleteOne({id: id});}if (i == 3) {// 获取通过post请求传递过来的参数let inputText = req.body;// 获取编号最大的图书,实现编号自动增长let maxObj = await (book.find().sort({_id:-1}).limit(1)).toArray();// 获取id和图片名称,把id 和 图片名称存进数据库里面inputText.id = parseInt(maxObj[0].id) + 1;inputText.picture = imgName;// // 执行语句result = await book.insertOne(inputText);console.log(inputText);console.log(maxObj);console.log(inputText.id);}if (i == 4) {console.log(parseInt(req.params.id));result = await book.find({id: parseInt(req.params.id)}).toArray();console.log(result);}if (i == 5) {let inputText = req.body;result = await book.updateOne({id:inputText.id}, {$set: {name: inputText.name,picture: imgName,author: inputText.author,price: inputText.price}});console.log(result);}// 返回客户端的信息res.json({status: "成功!",data: result});} finally {// 通常写关闭数据库的,但是,目前还不需要,因为只能查询一次,之后就关闭了!// await client.close();}
}// 查询所有数据
router.get("/", (req, res, next) => {// 调用run 方法,传参数run("", 1, res, req);
});// 删除
router.delete("/:id", (req, res, next) => {run("", 2, res, req);
});// 上传图片的
// 在这里传内置函数过去
router.post("/file", addfild.single('file'), (req, res, next) => {})// 添加
router.post("/", (req, res, next) => {run("", 3, res, req);
})// 渲染数据
router.get("/:id", (req, res, next) => {run("", 4, res, req);
})// 修改数据
router.put("/", (req, res, next) => {run("", 5, res, req);
})module.exports = router;

ejs 页面:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="stylesheets/book.css"><link rel="stylesheet" href="stylesheets/index.css">
</head><body><div id="app"><h3>图书管理系统</h3><div id="addbtn"><!-- <div id="sort"><button id="sortId" @click="sortId">按id倒序</button></div><div id="search"><input type="text" name="" id="searchText"><button id="searchbtn" @click="search">搜索</button></div> --><button id="appBook">新增图书 + </button></div><table><tr><th>编号</th><th>书名</th><th>封面</th><th>作者</th><th>价格</th><th>操作</th></tr><tr v-for="(b, i) in book" :key="b.id"><td>{{ b.id }}</td><td>{{ b.name }}</td><td><div id="picture" :style="{backgroundImage: 'url(/images/' + b.picture + ')'}"></div></td><td>{{ b.author }}</td><td>{{ b.price }}</td><td><button id="update" @click="edit(b.id)">编辑</button><button id="delete" @click="del(b.id)">删除</button></td></tr></table><!-- 模态框 --><div id="modal_box"><!--修改or添加  --><div id="mdinfo"><table><tr><td colspan="2" id="td">新增图书信息</td></tr><tr><td>书名:</td><td><input type="text" id="name" class="text" v-model="bookObj.name" /></td></tr><tr><td>作者:</td><td><input type="text" id="author" class="text" v-model="bookObj.author" /></td></tr><tr><td>价格:</td><td><input type="text" id="price" class="text" v-model="bookObj.price" /></td></tr><tr><td>封面:</td><td style="display: flex;"><el-upload ref="mYupload" action="string" :http-request="handleChange"list-type="picture-card" :on-preview="handlePictureCardPreview":on-remove="handleRemove" :on-change="handleChange"><i class="el-icon-plus"></i></el-upload><el-dialog :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt=""></el-dialog><!-- <div class="Browse" :style="{backgroundImage: 'url(/images/' +  + ')'}"></div> --></td></tr><tr><td colspan="2"><button id="btn1" class="btn" @click="save">提交</button><button id="btn2" class="btn" @click="cancel">取消</button></td></tr></table></div></div></div>
</body>
<script src="javascripts/jquery-1.12.4.js"></script>
<script src="javascripts/axios.js"></script>
<script src="javascripts/vue.js"></script>
<script src="javascripts/index.js"></script>
<script>var path = "http://127.0.0.1:8082/bookApi/";var app = new Vue({el: "#app",data: {book: [],bookObj: { "id": 0, "name": "", "picture": "", "author": "", "price": "" },// 文件上传dialogImageUrl: '',dialogVisible: false,rawName: ""},created() {// 查询所有的数据this.selectData();// 把图片的名称赋值this.bookObj.picture = this.rawName;},methods: {// 查询selectData() {axios.get(path).then((res) => {this.book = res.data.data;})},// 删除del(id) {if (confirm("您确定要删除这数据吗?")) {axios.delete(path + id).then((res) => {console.log(id);console.log(res);alert("删除成功!");// 调用查询全部的数据this.selectData();})}},// 文件上传的样式// 删除handleRemove(file, fileList) { },// 放大handlePictureCardPreview(file) {this.dialogImageUrl = file.url;this.dialogVisible = true;},// 添加封面图handleChange(file) {// 如果缩略图这个元素在的话,就删除这个这个,然后重新上传一个(其实就是为了方便修改图片)if ($('.el-upload-list__item').length > 0) {// 删除缩略图图片$(".el-upload-list__item").remove();}let formDate = new FormData();formDate.append('file', file.raw);// console.log(file.raw.name);formDate.append("file", file);axios.post(path + "file", formDate).then((data) => {});this.rawName = file.raw.name;},// 添加图书与修改图书save() {if (this.bookObj.id) {// 修改axios.put(path, this.bookObj).then((data) => {if (data.data.status === "成功!") {// console.log(data.data.data);alert("修改成功!");this.bookObj = { id: 0, name: "", picture: "", author: "", price: "" };$("#modal_box").css("display", "none");// 删除缩略图图片$(".el-upload-list__item").remove();//  重新查询一次数据this.selectData();}})} else {// 添加axios.post(path, this.bookObj).then((data) => {if (data.data.status === "成功!") {// console.log(data.data.data);alert("添加成功!");this.book.id = 0; // 因为是添加,所以id要重置为0this.bookObj = { id: 0, name: "", picture: "", author: "", price: "" };$("#modal_box").css("display", "none");// 删除缩略图图片$(".el-upload-list__item").remove();//  重新查询一次数据this.selectData();}})}},// 编辑图书edit(id) {$("#td").html("修改图书信息");$("#modal_box").slideToggle();axios.get(path + id).then((data) => {this.bookObj = data.data.data[0];// 寻找ul节点,然后创建li节点,并给li节点添加一个类,最后把li添加到ul里面var ul = document.querySelector('ul');var li = document.createElement("li");li.className = "el-upload-list__item";// 再创建一个img节点var img = document.createElement("img");//设置 img 图片地址、宽、高img.src = "images/" + this.bookObj.picture;img.width = 148;img.height = 148;ul.appendChild(li);li.appendChild(img);// console.log(this.bookObj);})},// 模态框取消按钮cancel() {$("#modal_box").css("display", "none");$(".text").val("");// 删除缩略图图片$(".el-upload-list__item").remove();}}});// 模态框显示$("#appBook").click(function () {$("#modal_box").slideToggle();$("#td").html("新增图书信息");});</script></html>

2、运行结果:

在这里插入图片描述


http://www.ppmy.cn/news/917471.html

相关文章

IDEA中 application.yaml文件没有绿色的叶子

IDEA中 application.yaml文件没有绿色的叶子 问题背景 前段时间一直在刷算法题和备战考试&#xff0c;忽略了项目方面的锻炼&#xff0c;于是今天就想着来写一个练手的项目&#xff0c;重新熟悉一下技术栈。结果刚搭建一个SpringBoot项目&#xff0c;就发现application.yaml配…

vbseltext_VB编程技巧之selstart, sellength,seltext属性

VB编程技巧之selstart, sellength,seltext属性 - 使用 TextBox 中的文本 利用 TextBox 的 SelStart、SelLength 和 SelText 属性&#xff0c;可以控制 TextBox的插入点和选择行为。这些属性仅能在运行时使用。 当一个 TextBox 首次得到焦点时&#xff0c;TextBox 缺省的插入点和…

python和vb编程哪个好_自学编程是从python还是从vb好

答&#xff1a;做桌面软件的话&#xff0c;VB好一点&#xff0c;Python主要用于脚本上&#xff0c;网页脚本、系统管理等都经常用&#xff0c;病毒什么的一般也可以用Python写脚本&#xff0c;但是还是汇编、C\C比较合适。 Python相对于VB就是资源少了点&#xff0c;没有微软专…

VB+SQL Server 2008 基础编程笔记

最近在帮同学写数据库的课程设计&#xff0c;顺手整理了一些VB编程与连接数据库的笔记。 新手入门&#xff0c;请多包涵。 目录 ADO控件连接数据库 使按钮不可用 加载隐藏显示关闭窗体 调用其他窗体的对象 文本框输入密码变 * 退出程序 弹出消息框 判断语句 强制跳转…

VB 坐标系简介与使用

VB坐标系统简介 本篇简要介绍如何改变系统默认坐标系统&#xff0c;使其变成正常的二维坐标系统&#xff0c;从而直观的绘制所需要的几何图形&#xff0c;本篇附带操作案例 目录&#xff1a; 1、系统默认坐标系 2、坐标系坐标系变换方法 3、案例源码演示 1、系统默认坐标系是…

plc vb c语言编程,【实例】VB实现plc与上位机通讯应用程序

有关VB实现的plc与上位机通讯应用程序,包括通信初始化程序,通信控件MSComm1属性设置,从PLC读取资料,将寄存器内数据资料PC上显示观察监控等,一起来看看。 VB实现plc与上位机通讯应用程序 可编程控制器PLC与上位机PC之间通信,下位机为PLC,基于其可靠性极高,主要承担控制…

VB.NET 使用CHART控件做实时曲线

VB.NET 使用CHART 控件做实时曲线 本人初学vb.net 编程&#xff0c;因一工程需要将现场数据采集过来&#xff0c;并以实时曲线的方式&#xff0c;显示出来&#xff0c;顾写了个例子程序&#xff0c;供大家参考&#xff0c;不对的地方请大家指正&#xff0c;谢谢&#xff01; …

【编程常识】关于 Visual Basic 6.0 语言

什么是 Visual Basic 6.0&#xff1f; Visual basic 6.0是一种由微软公司开发的包含协助开发环境的事件驱动编程语言&#xff0c;它源自于BASIC编程语言&#xff0c;拥有图形用户界面&#xff08;GUI&#xff09;和快速应用程序开发&#xff08;RAD&#xff09;系统&#xff0…