关键词:mongodb安装 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查询,增加,修改,删除

工具介绍

MongoDB

MongoDB是基于Javascript语言的数据库,存储格式是JSON,而Node也是基于JavaScript的环境(库),所以node和mongoDB的搭配能减少因为数据转换带来的时间空间开销。

Mongoose

是MongoDB的一个对象模型工具,它将数据库中的数据转换为JavaScript对象以供你在应用中使用,封装了MongoDB对文档的的一些增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单。

Robomongo

一个可视化的mongoDB操作软件,类似于mysql的navicat可视化工具。

捋一捋它们的关系,mongoDB是一个数据库,mongoose是你在自己代码中操作mongo数据库的接口,而robomongo是mongo数据库的可视化工具,通过它的界面方便直接操作数据库内容。

工具安装

MongoDB安装

1.安装mongoDB

到官网https://www.mongodb.com/download-center#community下载程序安装,选择custom模式就行。

2.建立MongoDB环境

需要自己建立db目录作为数据库环境,在命令行窗口中输入

$ md \data\db

建立db文件夹后,在命令窗口中进入安装目录的bin文件夹执行mongod.exe,把数据库安装在\data\db中。mongoDB会检测你的根目录是否有data\db文件夹,如果有会默认安装到这个文件夹里面。

 $ cd C:\Program Files\MongoDB\Server\3.2\bin$ mongod.exe

当然也可以直接在系统根目录下创建data\db文件夹,然后在mongoDB安装文件夹中双击执行mongod.exe。

3.启动MongoDB

命令行工具中输入:

 $ cd C:\Program Files\MongoDB\Server\3.2\bin$ mongod.exe

为了避免每次都要输入目录,所以在系统变量里面配置一下path变量,把“;C:\Program Files\MongoDB\Server\3.2\bin”放到path后面(记得加;隔开),以后可以直接在命令行窗口输入mongod.exe回车即可。

在浏览器中输入网址:http://localhost:27017/ 。如果服务启动成功会看到以下一段话:It looks like you are trying to access MongoDB over HTTP on the native driver port.

4.连接MongoDB(这一步基本没有用,只有在命令行工具中使用mongo原生方法时需要,而在mongoose里面会有连接的代码,Robomongo运行也会有连接)

命令行工具中输入mongo.exe,回车。

如果出现这个警告:2016-07-16T14:49:02.827+0800 I CONTROL [main] Hotfix KB2731284 or later update is not installed, will zero-out data files那是因为Windows缺少一个补丁,从这个链接下周补丁451413_intl_x64_zip,然后解压安装包,在你解压的目录下找到Windows6.1-KB2731284-v3-x64.mus安装文件。安装重启即可。

Robomongo安装以及使用

直接到官网https://robomongo.org/下载安装,安装成功后运行,第一次运行,需要新创建一个连接,如图创建test,点击save保存连接。

选择test,点击connect连接数据库。robomongo会自己搜索你系统里面安装的mongodb并与其连接。如图

连接成功后,显示你的数据库,在这个节目可以对数据库进行操作。如图:

Mongoose安装与加载

首先假定你已经安装了 Node.js,命令行工具输入:

$ npm install mongoose -g

在使用的文件中require(“mongoose”);即可。

使用Mongoose进行CRUD操作

使用基本步骤

Mongose基于mongodb的原生方法,自己定义了一套操作MongoDB数据库的接口,比原生方法更加简单方便。为了更加直观,下面的步骤结合例子来讲。假如我需要做一个教务系统,需要存储学生Student的信息,学生信息通常包含姓名name,学号id,电话phone,登录日期date等。我把学生的信息存在mongodb的myDB数据库中,集合的名字叫students。如图:

_id这个域你可以自己定义,但如果你没有定义,系统会自动给你加上。下面先介绍在node中通过mongoose对mongodb进行操作的必须前提步骤:

1.node连接数据库

mongoose.connect('mongodb://user:pass@ip:port/database');

这只是最基本的连接,我们一般还会加一些设置,是否开启调试模式,连接提示等。通常我会这么写:

var mongoose = require("mongoose");
mongoose.Promise = global.Promise;/*调试模式是mongoose提供的一个非常实用的功能,用于查看mongoose模块对mongodb操作的日志,一般开发时会打开此功能,以便更好的了解和优化对mongodb的操作。*/
mongoose.set('debug', true);/*一般默认没有user和password*/
var db=mongoose.connect('mongodb://localhost/myDB');db.connection.on("error", function (error) {  console.log("数据库连接失败:" + error);
}); db.connection.on("open", function () {  console.log("数据库连接成功");
});

没有mongoose.Promise = global.Promise会出现如下错误(这个错误没有什么影响):

意思是mongoose自带的promise过期了,然后需要使用v8引擎的promise。

2.定义模式(Schema)

每个模式映射mongoDB的一个集合(注意映射这个词,下面会讲为什么),它定义(只是定义,不是实现)这个集合里面文档的结构,就是定义这个文档有什么字段,字段类型是什么,字段默认值是什么等。除了定义结构外,还定义文档的实例方法,静态模型方法,复合索引,中间件等。详情自己查看mongoose官方文档。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;/*定义模式Student_Schema*/
var Student_Schema = new Schema({name: String,id: Number,phone: String,date: Date
}, {versionKey: false
});/*定义模型Student,注意数据库存的是students*/
mongoose.model("Student", Student_Schema);

{versionKey: false}是干嘛用?如果不加这个设置,我们通过mongoose第一次创建某个集合时,它会给这个集合设定一个versionKey属性值,这个属性值包含这个文档的内部版本,数据库中显示为_v,如图:

通过{versionKey: false}可以配置这个参数,让数据库不再添加这个属性,格式是:new Schema({..}, { versionKey: false });

3.定义模型(Model)

模型用来实现我们定义的模式,调用mongoose.model来编译Schema得到Model。

/*定义模型Student,数据库存的是students*/
mongoose.model("Student", Student_Schema);

为什么上面我强调模式的映射,那是因为模式仅仅是和db中集合文档的结构相对应(映射),它并不直接在数据库中操作这个结构,模型才是直接与数据库打交道的存在,可以这么说:模式是定义结构,模型是实现操作。当我们使用mongoose.model(“Student”, Student_Schema)创建Student模型对数据进行操作时,数据库会寻找一个名字叫students集合接受Student模型的操作,特别需要注意的是:1.如果是增加(instance.save)操作时,数据库中没有这个集合,数据库会自动创建这个集合存储数据,这个集合产生规则为:把Model名字字母全部变小写和在后面加复数s。2.如果是删改查三个操作数据库中没有这个集合,那就是没有,删除空修改空返回空。

4.访问模型

var MyStudent = mongoose.model("Student");

到这里,已经基本完成了使用mongoose前提操作了。有没有觉得有点繁琐,其实我也觉得挺繁琐,幸运的是234可以一步创建:

var MyStudent = mongoose.model('Student',{name: String,id: Number,phone: String,date: Date
});

5.创建实例(instance)

var sam = new MyStudent({name: "sam976",id: 123,phone: "18706888888",date: Date.now()
});

一般只在save(增加)操作中需要。

模型的实例是集合中真实的数据,就是collection中的document,用mysql中的术语来说就是一条记录。模型在数据库中建好了集合和文档结构后,通过实例往里面添加真实的document。

捋一捋模式、模型、实例的关系:模式定义了操作和属性,这些操作和属性包括mongoose自带和自定义,而模型和实例可以对模式里面定义的属性和方法进行引用。模型是mongoose用来和数据库直接打交道的中介,实例是往数据库存的真实数据。模式并非必须,那为什么要分开模式和模型呢?我觉得是遵循了软件设计中“定义和实现分开”这个原则。有的文章说模式没有操作数据库的能力,模型才有,对这个观点,我觉得部分对,虽说模式不能直接操作数据库,但模式定义的方法可以被模型用来操作数据库。官方文档是这么说的:

Schemas not only define the structure of your document and casting of properties, they also define document instance methods, static Model methods, compound indexes and document lifecycle hooks called middleware.

以上是使用mongoose进行增删查改操作都需要经过的前提步骤,下面正式介绍对数据库的增删查改(CRUD)操作。

CRUD操作

1.CRUD之create

使用模型创建sam实例,sam实例调用save方法把document存入数据库的students集合中,代码如下

    var MyStudent = mongoose.model("Student");var sam = new MyStudent({name: "sam976",id: 123,phone: "18706888888",date: Date.now()});sam.save(function(err) {});

通过robomongo查看数据库,可以看到数据已经存放成功,如图

2.CRUD之read

使用MyStudent模型调用find()方法返回students集合的所有内容,第一个参数定义条件,第二个参数是回调函数,回调函数中的docs是返回的是查找结果,结果形式为一个json数据数组[{},{}]。

    var MyStudent = mongoose.model("Student");MyStudent.find({}, function(err, docs) {});

比如数据库students集合中,有如下数据:

运行上面代码,结果console.log输出显示如下:

模型还可以调用其他很多查询的函数,比如

Model.findById(id, [projection], [options], [callback]);
Model.findOne([conditions], [projection], [options], [callback]);

篇幅较多,这里不摊开来讲(以后会专门出一篇介绍),可以自己查看官方文档关于Querying介绍

3.CRUD之update

使用MyStudent模型调用update()方法完成更新,第一个参数是条件(也就是where name=”sam976”),第二个参数修改的内容。

    var MyStudent = mongoose.model("Student");MyStudent.update({name:"sam976"},{id:456,phone:"12345678910"}, function(error){});

运行如上代码前,如图

运行如上代码后,如图

4.CRUD之delete

使用MyStudent模型调用remove()方法删除文档。

var MyStudent = mongoose.model("Student");
MyStudent.remove({ name: 'sam976' }, function (err) {});

源码结构

使用mongoose的时候,通常会在项目中创建三个文件:connect.js,mongoose-db.js,app.js。

其中connect.js存放的是连接数据库的操作,我们只需要加载一次即可在程序运行期间一直连接数据库。

mongoose-db.js文件存放模式和模型的生成的代码,没有连接信息,也没有其他额外不相干代码,可以在在mongoose-db.js中把模型exports公开:

var MyStudent = mongoose.model("Student", Student_Schema);
exports.MyStudent=MyStudent;/*定义其他模型和模式*/
var MyTeacher = mongoose.model("Teacher", Teacher_Schema);
exports.MyTeacher=MyTeacher;

然后在app.js中引用:

var MyStudent = require("./mongoose-db").MyStudent;
var MyTeacher = require("./mongoose-db").MyTeacher;

app.js存放对数据库的操作,比如CRUD。通过这样的方式,结构比较清晰,代码可读性大大增强。

下面放源码(目的是给自己备份,笑脸…)

connect.js

var mongoose = require("mongoose");
mongoose.Promise = global.Promise;//为了解决过期的问题
/*调试模式是mongoose提供的一个非常实用的功能,用于查看mongoose模块对mongodb操作的日志,一般开发时会打开此功能,以便更好的了解和优化对mongodb的操作。*/
mongoose.set('debug', true);
/*mongoose会缓存命令,只要connect成功,处于其前其后的命令都会被执行,connect命令也就无所谓放哪里*/
var db=mongoose.connect('mongodb://localhost/myDB');db.connection.on("error", function (error) {  console.log("数据库连接失败:" + error);
});db.connection.on("open", function () {  console.log("数据库连接成功"); 

mongoose-db.js

require('./connect');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
/*定义模式Student_Schema*/
var Student_Schema = new Schema({name: String,id: Number,phone: String,date: Date}, {versionKey: false
});/*定义模型Student,数据库存的是students*/
var MyStudent = mongoose.model("Student", Student_Schema);
exports.MyStudent=MyStudent;/*mongoose.Schema({username: {// 真实姓名type: String,required: true},password: { // 密码type: String,required: true}
});*/

app.js

require("./mongoose-db");
var express = require("express");
var mongoose = require("mongoose");
var MyStudent = require("./mongoose-db").MyStudent;
var app = express();app.use(express.static("./"));
app.get("/create", function(req, res) {console.log("create 函数")var beta = new MyStudent({name: "beta",id: 124,phone: "1871111111",date: Date.now()});beta.save(function(err) {if (err) {console.log(err);} else {console.log('存入成功');}});res.send("存入成功!!");});app.get("/read", function(req, res) {console.log("读取函数");MyStudent.find({}, function(err, docs) {console.log(docs);/*对docs进行操作*/});res.send("读取成功!!");});app.get("/readOne", function(req, res) {console.log("读取单值函数");MyStudent.findOne({name: req.query.student_name}, {"id": 1,"_id": 0}, function(err, docs) {if (docs.id === req.query.student_id) {res.send('登录成功');console.log(docs.password);} else {console.log(docs.password);res.send('登录失败');}});/*过滤查询,参数2: {'name':1, 'password':0} 查询文档的返回结果包含name , 不包含password.(_id默认是1)*//*model.find({},null,{limit:20});过滤查询,参数3: 游标操作 limit限制返回结果数量为20个,如不足20个则返回所有*/});app.get("/update", function(req, res) {console.log("更新函数");MyStudent.update({name: "sam976"}, {id: 456,phone: "12345678910"}, function(error) {});res.send("更新成功!!");});app.get("/delete", function(req, res) {console.log("删除函数");MyStudent.remove({name: 'sam976'}, function(err) {if (err) return handleError(err);// removed!});res.send("删除成功!!");});app.listen(3001, function() {console.log("start server")
});

为了测试,我还写了个html。data-operate.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>data-operate</title>
</head><body><form action="./create"><input type="submit" value="创建"></form><br/><form action="./read"><input type="submit" value="读取"></form><br/><form action="./update"><input type="submit" value="更新"></form><br/><form action="./delete"><input type="submit" value="删除"></form><br/><form action="./readOne"><input type="text" name="student_name"><input type="text" name="student_id"><input type="submit" value="单值读取"></form>
</body></html>

上文是在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作的简单介绍,以后会有进阶的文章。

参考文献:
Node.js 手册查询-3-Mongoose 方法
Mongoose Schemas v4.5.8
mongoose入门

*CSDN个人博客地址–点击这里*

转载于:https://www.cnblogs.com/sam976/p/5762279.html

在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)相关推荐

  1. MongoDB入门学习(三):MongoDB的增删查改

    对于我们这样的菜鸟来说,最重要的不是数据库的管理,也不是数据库的性能,更不是数据库的扩展,而是怎么用好这款数据库,也就是一个数据库提供的最核心的功能,增删查改. 由于MongoDB存储数据都是以文档的 ...

  2. 基于SSM 和 layui 的增删查改

    开发工具: IDEA 2021 WebStorm 2021 Mysql 8.0 开发环境:JDK 8 TomCat 8.5.81 apache-maven-3.6.1 技术点:Spring + Spr ...

  3. Django中的shell,和数据增删查改

    django也有一个牛逼的调试工具,而scarpy是借鉴django的,shell是先在django中使用的 python manage.py shell (在项目根目录) 这是model下的Stud ...

  4. mock模拟的数据能增删改查吗_如何在Vue中使用Mockjs模拟数据的增删查改

    之前一直使用json-server在前端开发时,搭建本地数据接口测试,但有时又需要将做好的项目放于 github page上做项目演示.在本地时,json server很好使用,但一旦放在github ...

  5. android开发课程表app数据库,基于Android studio 的课程表增删查改功能(基于sqlite)

    [实例简介]Android studio 用SQLite实现课程表的增删查改功能,:实现详情浏览.编辑.及新增功能.课程编号可以实现正则检查(编号规则XX00000,XX表示两位大写的字母,00000 ...

  6. 粤嵌星计划打卡第90天(JDBC对于数据库中增删查改的操作)

    #粤嵌我来了##粤嵌星计划# 粤嵌星计划挑战 今天打卡第90天

  7. Java操作MongoDB数据库CRUD(增删查改)

    Java操作MongoDB数据库CRUD(增删查改) 借助mongo-java-driver包,对MongoDB数据库的集合(DataTable)及文档(BSON对象数据)进行增删查改操作.本文的核心 ...

  8. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  9. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...

  10. 8天学通MongoDB——第二天 细说增删查改

    2019独角兽企业重金招聘Python工程师标准>>> 看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongod ...

最新文章

  1. linux ps命令大全,Linux ps命令例子汇总
  2. 里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码
  3. Stanford机器学习笔记-1.线性回归
  4. Django 练习班级管理系统五 -- 查看老师列表
  5. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回
  6. Java实现 给定三个 int 变量, 求其中的最大值和最小值
  7. PeekMessage和GetMessage的区别
  8. 23.3. DELETE
  9. RabbitMQ消息确认机制之Confirm模式总结
  10. 基于联咏NT98528_IMX335_开发IPC模组实测_视频截图
  11. java毕业生设计新生报到管理系统计算机源码+系统+mysql+调试部署+lw
  12. SQL考试练习题及全部答案3
  13. Eclipse官网下载
  14. MySQL索引优化(二)索引失效
  15. npm -g, npm -s, npm -d 的区别
  16. 福建盼盼食品有限公司网络营销集团分析报告
  17. JavaScript新的对象创建方式---Object.create()
  18. Win10系统路由器设置教程
  19. html网页播放器编辑代码大全
  20. 修改deepin20.4窗口特效魔灯的动画时长

热门文章

  1. SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化(进阶篇)
  2. thinkpad笔记本电脑不按Fn键直接实现F1-F12功能的方法
  3. SQLite(3) Windows安装小结
  4. MySQL 用户域权限相关操作
  5. 为Eureka Server添加用户认证
  6. html弄多个按钮_html - 一个表单中的两个提交按钮
  7. oracle-Ora-01779-内联视图更新法
  8. 下列哪个滤波器是非线性的_上海海事数字信号处理2006试卷A参考答案
  9. delphi调用python_Delphi使用Python来解码邮件
  10. Javascript:Promise异步编程解决方案