热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NodeJs使用Mongodb

之前我们学习了Mongodb的Shell命令,现在我们再一个小小的node项目中使用一下mongodb吧我们先来初始化一个express项目第一步$npminstallexpres

之前我们学习了Mongodb 的Shell命令, 现在我们再一个小小的node项目中使用一下mongodb吧

我们先来初始化一个express项目

第一步

$ npm install express-generator -g
// 全局安装

第二步

$ express testmongodb
// 初始化一个项目

第三步

$ cd testmongodb

$ cnpm install

第四步

// 启动
$ npm start
然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。

更改目录结构

| bin
| modle
- db.js
| config
- config.js
| views
| public
| routes
- index.js
| app.js
| package.json

完善代码阶段

$ cnpm install mongodb ---save
// 安装mongodb

// config.js
var baseUrl = "mongodb://localhost:27017";
var dbbase = "/mongodb_demo"; // 这里是我的数据库名称哦
module.exports = {
"dburl": baseUrl + dbbase
};

// db.js
/**
* 数据库封装
*
*/
var MOngodbClient= require('mongodb').MongoClient
var assert = require('assert')
var cOnfig= require('../config/config.js')
/**
* 连接数据库
*/
function __connectDB(callback) {
MongodbClient.connect(config.dburl, function (err, db) {
callback(err, db)
})
}
/**
* 插入一条数据
* @param {*} collectionName 集合名
* @param {*} Datajson 写入的json数据
* @param {*} callback 回调函数
*/
function __insertOne(collectionName, Datajson, callback) {
__connectDB(function (err, db) {
var collection = db.collection(collectionName);
collection.insertOne(Datajson, function (err, result) {
callback(err, result); // 通过回调函数上传数据
db.close();
})
})
}
/**
* 查找数据
* @param {*} collectionName 集合名
* @param {*} Datajson 查询条件
* @param {*} callback 回调函数
*/
function __find(collectionName, JsonObj, callback) {
var result = [];
if (arguments.length != 3) {
callback("find函数必须传入三个参数哦", null)
return
}
__connectDB(function (err, db) {
var cursor = db.collection(collectionName).find(JsonObj);
if (!err) {
cursor.each(function (err, doc) {
assert.equal(err, null) // 使用node的assert模块来判断是否出错了
// 如果出错了,那么下面的也将不会执行了
if (doc != null) {
result.push(doc)
} else {
callback(null, result)
db.close();
}
})
}
})
}
/**
*
* 删除数据(删除满足条件的所有数据哦)
* @param {*} collectionName 集合名
* @param {*} json 查询的json数据
* @param {*} callback 回调函数
*/
function __DeleteMany(collectionName, json, callback) {
__connectDB(function (err, db) {
assert.equal(err, null)
//删除
db.collection(collectionName).deleteMany(
json,
function (err, results) {
assert.equal(err, null)
callback(err, results);
db.close(); //关闭数据库
}
);
});
}
/**
* 修改数据
* @param {*} collectionName 集合名
* @param {*} json1 查询的对象
* @param {*} json2 修改
* @param {*} callback 回调函数
*/
function __updateMany(collectionName, json1, json2, callback) {
__connectDB(function (err, db) {
assert.equal(err, null)
db.collection(collectionName).updateMany(
json1,
json2,
function (err, results) {
assert.equal(err, null)
callback(err, results)
db.close()
}
)
})
}
/**
* 获取总数
* @param {*} collectionName 集合名
* @param {*} json 查询条件
* @param {*} callback 回调函数
*/
function __getCount(collectionName, json, callback) {
__connectDB(function (err, db) {
db.collection(collectionName).count(json).then(function (count) {
callback(count)
db.close();
})
})
}
/**
* 分页查找数据
* @param {*} collectionName 集合名
* @param {*} JsonObj 查询条件
* @param {*} C 【可选】传入的参数,每页的个数、显示第几页
* @param {*} C callback
*/
function __findByPage(collectionName, JsonObj, C, D) {
var result = []; //结果数组
if (arguments.length == 3) {
//那么参数C就是callback,参数D没有传。
var callback = C;
var skipnumber = 0;
//数目限制
var limit = 0;
} else if (arguments.length == 4) {
var callback = D;
var args = C;
//应该省略的条数
var skipnumber = args.pageamount * args.page || 0;
//数目限制
var limit = args.pageamount || 0;
//排序方式
var sort = args.sort || {};
} else {
throw new Error("find函数的参数个数,必须是3个,或者4个。");
return;
}
//连接数据库,连接之后查找所有
__connectDB(function (err, db) {
var cursor = db.collection(collectionName).find(JsonObj).skip(skipnumber).limit(limit).sort(sort);
cursor.each(function (err, doc) {
if (err) {
callback(err, null);
db.close(); //关闭数据库
return;
}
if (doc != null) {
result.push(doc); //放入结果数组
} else {
//遍历结束,没有更多的文档了
callback(null, result);
db.close(); //关闭数据库
}
});
});
}
module.exports = {
__connectDB,
__insertOne,
__find,
__DeleteMany,
__updateMany,
__getCount,
__findByPage
}
// db.js 文件是数据库操作的DAO 层的封装

//app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var COOKIEParser = require('COOKIE-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
// 修改【1】
global.db = require('./modle/db.js') // 引入数据库封装好的 DAO 层方法
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(COOKIEParser());
app.use(express.static(path.join(__dirname, 'public')));
// 修改【2】 这里配置我们的路由
app.use('/', indexRouter)
app.use('/users', usersRouter)
app.use('/testconnect', indexRouter)
app.use('/testdeletemany', indexRouter)
app.use('/testupdatemany', indexRouter)
app.use('/count', indexRouter)
app.use('/testfingbypage', indexRouter)
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;

// index.js
// 这里用来配置路由操作
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function (req, res, next) {
res.render('index', { title: 'Express' });
});
// 测试数据库连接
router.get('/testconnect', function (req, res) {
global.db.__connectDB(function (err, db) {
if (err) {
console.log(err)
return
}
console.log(db)
res.render('index', { title: '连接数据库成功' })
})
})
// 测试插入数据
router.get('/testinsert', function (req, res) {
global.db.__insertOne('student', {
"name": "zjj",
"age": 33,
"interests": ['play'],
"sex": "男"
}, function (err, result) {
if (!err) {
console.log(result)
res.render('index', { title: '插入一条数据成功' })
} else {
console.log(err)
}
})
})
// 查找数据
router.get('/testfind', function (req, res) {
global.db.__find('student', { age: { $lt: 30 } }, function (err, result) {
if (!err) {
console.log(result)
res.render('index', { title: '查询成功' })
} else {
console.log(err)
}
})
})
// 删除数据(删除符合条件的全部数据哦)
router.get('/testdeletemany', function (req, res) {
global.db.__DeleteMany('student', { "age": { $gte: 19 } }, function (err, result) {
if (!err) {
console.log(result)
res.render('index', { title: '删除成功' })
} else {
console.log(err)
}
})
})
// 修改数据(满足条件的数据全部都会被修改)
router.get('/testupdatemany', function (req, res) {
global.db.__updateMany(
'student',
{
"name": "zjj"
},
{
$set: { name: "cnm" }
},
function (err, result) {
if (!err) {
console.log(result)
res.render('index', {
title: '修改成功'
})
}
}
)
})
// 统计总数
router.get('/count', function (req, res) {
global.db.__getCount('student', {}, function (count) {
console.log(count)
res.render('index', {
title: `一共${count}条数据`
})
})
})
// 分页显示
// page是页数,从 0 开始
router.get('/testfingbypage', function (req, res) {
global.db.__findByPage('student', {}, {
"pageamount": 6,
"page": 0
}, function (err, result) {
if (err) {
throw err;
}
res.send(result);
console.log(result.length);
})
})
module.exports = router;

启动一次

$ npm start

打开localhost:3000测试一下路由吧,再看看自己数据库中是否进行了相关操作了呢~

感谢支持!!


推荐阅读
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • npm 发布 WhalMakeLink 包:链接管理与优化的新选择
    WhalMakeLink 是一个强大的 npm 工具,专为项目管理和优化而设计。它能够自动在项目的 README 文件中生成当前工程目录下所有子项目的链接地址,极大提升了开发效率和文档维护的便捷性。通过简单的 `npm init` 命令即可快速启动和配置该工具,适用于各种复杂项目结构。 示例演示了其基本用法和功能。 ... [详细]
  • 基于Node.js、EJSExcel、Express与Vue.js构建Excel转JSON工具:首阶段——Vue.js项目初始化及开发环境配置
    在近期的一个H5游戏开发项目中,需要将Excel数据转换为JSON格式。经过调研,市面上缺乏合适的工具满足需求。因此,决定利用Node.js、EJSExcel、Express和Vue.js自行构建这一工具。本文主要介绍项目的第一阶段,即Vue.js项目的初始化及开发环境的配置过程,详细阐述了如何搭建高效的前端开发环境,确保后续功能开发的顺利进行。 ... [详细]
  • 利用 Vue CLI 脚手架在 Visual Studio Code 中创建 Vue 项目
    本文介绍了如何在 Visual Studio Code 中使用 Vue CLI 脚手架创建 Vue 项目。首先,确保已安装 Node.js 和 npm,因为 Vue CLI 的安装依赖于 npm。可以通过在命令行中输入 `npm -v` 来检查 npm 是否已成功安装。接下来,我们将详细说明 Vue CLI 的安装步骤及其在 Visual Studio Code 中的应用。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 如何构建基于Spring MVC框架的Java Web应用项目
    在构建基于Spring MVC框架的Java Web应用项目时,首先应创建一个新的动态Web项目。接着,需将必要的JAR包导入至WebContent/WEB-INF/lib目录下,确保包括Spring核心库及相关依赖。如遇缺失的JAR包,可向社区求助或通过Maven等工具自动下载。正确配置后,即可开始搭建应用结构与功能模块。 ... [详细]
  • 优化Node.js项目:有效管理和清理依赖项
    在Node.js项目中,有效管理和清理依赖项是提升性能和安全性的重要步骤。为了确保项目中仅保留必要的库,应定期检查并移除`node_modules`目录下不再使用的包。同时,所有必需的依赖项都应在`package.json`文件中明确列出,以保证项目的可维护性和可复现性。此外,利用如`npm prune`等工具可以帮助自动化这一过程,进一步提高效率。 ... [详细]
  • 在 VSCode 中高效进行代码调试的关键在于正确配置 Node.js 环境。首先,需要设置 `launch.json` 文件中的 `program` 属性为项目的启动路径。通常情况下,这会指向 `package.json` 文件中的 `start` 脚本。通过这种方式,可以在启动调试时自动添加断点,从而更方便地进行代码调试。此外,合理利用 VSCode 的调试工具和功能,如条件断点、日志点和变量监视,可以进一步提升调试效率。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 本文探讨了在PowerShell中高效管理和操作大规模内存对象的技术与实践。详细介绍了如何启用PowerShell的大内存支持功能,并提供了优化性能和减少资源消耗的具体方法。此外,还讨论了常见问题及其解决方案,旨在帮助用户在处理复杂数据集时提高效率和稳定性。 ... [详细]
  • C语言实现:深入解析希尔排序算法
    C语言实现:深入解析希尔排序算法 ... [详细]
author-avatar
漫步乡间2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有