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

news2025/4/2 17:08:02

文章目录

  • 一、安装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");  //依赖MongoClient

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 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");  //依赖MongoClient

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 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大于等于202201
        let 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要重置为0
                                this.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.coloradmin.cn/o/752393.html

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

相关文章

前端vue入门(纯代码)31_route-link的repalce属性

如果夜里十二点我还回你消息&#xff0c;那么意味着什么&#xff0c;意味着我是真的很喜欢玩手机。 【29.Vue Router--router-link的replace属性】 <router-link>的replace属性 replace属性的作用是&#xff1a;控制路由跳转时操作浏览器历史记录的模式。【当我们从一个…

城市内涝监测设备-内涝监测终端

随着我国城市化发展迅速、全球极端天气现象频发带来的暴雨天气增多&#xff0c;汛期暴雨引发道路低洼处、立交桥底、隧道、涵洞等城市 内涝时有发生&#xff0c;甚至开启城市看海模式&#xff0c;对交通、电力、通讯等造成了严重的影响和破坏&#xff0c;严重时造成人民生命、财…

放弃使用Merge,开心拥抱Rebase!

1. 引言 大家好&#xff0c;我是比特桃。Git 作为现在最流行的版本管理工具&#xff0c;想必大家在开发过程中都会使用。由于 Git 中很多操作默认是采用 Merge 进行的&#xff0c;并且相对也不容易出错&#xff0c;所以很多人都会使用 Merge 来进行合并代码。但Rebase 作为 Gi…

官宣!菁英实习生计划启动,百度大模型团队诚邀你的加入

大模型风起&#xff0c;人才需求涌 在这个充满变革的时代&#xff0c;我们见证了AI的快速发展。从“阿尔法狗”击败世界围棋冠军&#xff0c;到生成式大模型以势不可挡的浪潮席卷全球&#xff0c;掀起人类社会一场眩晕式变革。新技术、新工具、新的生产力正在改变经济活动各环…

小红书运营推广

大家好&#xff0c;我是权知星球&#xff0c;今天给大家分享一下小红手运营推广的一些经验&#xff0c;希望能给大家运营小红书带来一些帮助。 这篇文章虽然是基于小红书的运营写的&#xff0c;但新媒体的东西都是相通的&#xff0c;相信这篇文章对运营其他媒体的同学也会有所…

抓包工具Fiddler:fiddler的介绍及安装

Fiddler简介 Fiddler是比较好用的web代理调试工具之一&#xff0c;它能记录并检查所有客户端与服务端的HTTP/HTTPS请求&#xff0c;能够设置断点&#xff0c;篡改及伪造Request/Response的数据&#xff0c;修改hosts&#xff0c;限制网速&#xff0c;http请求性能统计&#xff…

MyBatis源码分析_Executor组件及3个火枪手(6)

目录 1. 前提 2. Executor执行器 3. 总结 4. 三个火枪手 5. StatementHandler生成Statement 6. ParameterHandler 参数解析 7. BoundSql的数据结构 8. 总结 1. 前提 在Mybatis源码分析_事务管理器 &#xff08;5&#xff09;_chen_yao_kerr的博客-CSDN博客一文中&…

网关微服务简单配置

导入一下网关的基本依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud<…

直播商城系统源码的威力:开启直播购物新时代

随着科技的不断进步和人们对互动性购物体验的追求&#xff0c;直播购物正成为电商行业的热门趋势。直播商城系统源码的威力在这一潮流中愈发显现&#xff0c;为商家和消费者提供了无限的机会和便利。 下面是一个简单的示例&#xff0c;展示了如何利用直播商城系统源码创建一个…

深度强化学习:深度解析 MADDPG

深度强化学习:深度解析 MADDPG 学习强化学习,码代码的能力必须要出众,要快速入门强化学习 搞清楚其中真正的原理,读源码是一个最简单的最直接的方式。最近创建了一系列该类型文章,希望对大家有多帮助。 另外,我会将所有的文章及所做的一些简单项目,放在 1.MADDPG 原理…

JS脚本 - 批量给所有指定标签追加Class属性

JS脚本 - 批量给所有指定标签追加Class属性 前言一. 脚本二. 测试运行 前言 公司里我们有个应用引入了UBT埋点&#xff0c;记录了页面上所有的点击操作以及对应的点击按钮。但是我们看下来发现&#xff0c;我们需要给每个按钮加一个唯一标识做区分&#xff0c;并且这个ID是给U…

选读SQL经典实例笔记07_日期处理(下)

1. 一个季度的开始日期和结束日期 1.1. 以yyyyq格式&#xff08;前面4位是年份&#xff0c;最后1位是季度序号&#xff09;给出了年份和季度序号 1.2. DB2 1.2.1. sql select (q_end-2 month) q_start,(q_end1 month)-1 day q_endfrom (select date(substr(cast(yrq as c…

Linux系统编程(信号处理 sigacation函数和sigqueue函数 )

文章目录 前言一、sigaction二、sigqueue函数三、代码示例总结 前言 本篇文章我们来介绍一下sigacation函数和sigqueue函数。 一、sigaction sigaction 是一个用于设置和检查信号处理程序的函数。它允许我们指定信号的处理方式&#xff0c;包括指定一个函数作为信号处理程序…

AsyncImage, BackgroundMaterials, TextSelection, ButtonStyles 的使用

1. AsyncImage 异步加载图片 1.1 实现 /*case empty -> No image is loaded.case success(Image) -> An image succesfully loaded.case failure(Error) -> An image failed to load with an error.*/ /// iOS 15 开始的 API 新特性示例 /// 异步加载图片 struct As…

Ae 效果:CC Plastic

风格化/CC Plastic Stylize/CC Plastic CC Plastic&#xff08;CC 塑料&#xff09;效果用于创建具有塑料质感的图像或视频效果&#xff0c;它模拟了塑料材质的外观特性&#xff0c;包括光照反射、表面凹凸以及光泽效果等。 ◆ ◆ ◆ 效果属性说明 Surface Bump 表面凹凸 通过…

IoT 场景下 TDengine 与老牌时序数据库怎么选?看看这份TSBS报告

上周一&#xff0c;TDengine 正式发布了 IoT 场景下基于 TSBS 的时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;性能基准测试报告。该报告模拟虚拟货运公司车队中一组卡车的时序数据&#xff0c;预设了五种卡车规模场景&#xff0c;在相同的 AWS 云环…

[Lesson 01] TiDB数据库架构概述

目录 一 章节目标 二 TiDB 体系结构 1 TiDB Server 2.1 TiKV 2.2 TiFlash 3 PD 参考 一 章节目标 理解TiDB数据库整体架构了解TiDB Server TiKV tiFlash 和 PD的主要功能 二 TiDB 体系结构 了解这些体系结构是如何实现TiDB的核心功能的 1 TiDB Server TiDB Serve…

记录--你知道Vue中的Scoped css原理么?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 追忆Scoped 偶然想起了一次面试&#xff0c;二面整体都聊完了&#xff0c;该做的算法题都做出来了&#xff0c;该背的八股文也背的差不多了&#xff0c;面试官频频点头&#xff0c;似乎对我的基础和项…

云计算的学习(四)

四、云计算中的存储基础知识 1.云计算虚拟化中的存储架构 ①虚拟化存储 在虚拟化存储架构中&#xff0c;最底层为物理磁盘。 底层的硬件组成存储池&#xff0c;存储池分为NAS存储和SAN存储&#xff1b;NAS存储需要文件系统&#xff1b;SAN存储需要对存储池进行逻辑划分产生逻…

【VSCode | 使用技巧集锦】中文插件突然失效、配置单个工程(工作区)编码

目录 ✨技巧一&#xff1a;中文插件失效的解决办法✨技巧二&#xff1a;配置单个工程(工作区)编码 ✨技巧一&#xff1a;中文插件失效的解决办法 问题描述&#xff1a;VSCode之前安装了中文插件&#xff0c;可以正常汉化&#xff0c;用了一段时间都没问题&#xff0c;今天打开v…