前言node.js的出现使得用前端语法(javascript)开发后台服务成为可能。越来越多的前端因此接触后端,甚至转向全栈开发。数据库操作对于后端开发是必不可少的。MongoDB是一个基于分布式文件存储的开源数据库系统。本文详细介绍如何用node.js+mongoose玩转MongoDB。希望能帮助到有需要的人。由于我是用Mac开发的,所以下面的操作都是在Mac下进行的。1、环境搭建和安装Node.js如果有node环境可以跳过。nodejs官网提供了macOS安装包,直接下载安装即可。现在nodejs的稳定版本已经到了12.11.1。安装MongoDBMongoDB是为现代应用程序开发人员和云时代构建的基于文档的通用分布式数据库。上个月(9月)macOS包管理器Homebrew宣布移除MongoDB。原因是去年10月,MongoDB宣布将其开源许可从GNUAGPLv3切换到SSPL(ServerSidePublicLicense),以回应AWS等云厂商将MongoDB作为服务提供给用户而不回馈给用户社区。MongoDB希望从软件即服务中获得收入。Homebrew认为MongoDB已经不属于开源的范畴了……言归正传,由于以上原因,我们不能直接使用brewinstallmongodb来安装MongoDB。幸运的是,MongoDB维护了一个自定义的Homebrewtap本身。并更新了InstallMongoDBCommunityEdition中的安装步骤。Mac下MongoDB的最新安装步骤如下:1.首先安装HomebrewHomebrew是一个macOS的包管理器。因为OSX默认不包含Homebrewbrew包,所以必须先安装,已经安装的可以跳过。/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"安装过程会有点长,终端输出信息超过一屏,这里我只截取head和tail分为两部分。2.然后获取MongoDBHomebrewTapbrewtapmongodb/brew3。最后安装MongoDBCE(社区版)brewinstallmongodb-community@4.2现在MongoDB环境已经安装到你的Mac上了。安装mongoosenode.js可以直接操作MongoDB,但是直接通过MongoDB命令语法编写MongoDB校验、数据类型转换和业务逻辑模板比较麻烦。所以我们使用猫鼬。mongoose是MongoDB的一个对象模型工具。封装了MongoDB的常用方法,让node.js操作MongoDB更加优雅简洁。刚才的node.js和MongoDB安装在全局环境下,mongoose安装在你的项目下:cdyour-projectnpmi-Smongoose至此,你的开发环境已经全部安装完毕。2.启动MongoDB服务要运行MongoDB,首先要启动它。启动MongoDB服务有两种方式:1.前台运行mongod--config/usr/local/etc/mongod.conf前台运行的好处是可以查看一些反馈和日志,便于调试。另外,如果要关闭服务,只需要在终端中按下control+c键即可。2.也可以作为macOS服务,后台运行brewservicesstartmongodb-community@4.2。优点是开机自动启动,随时可以使用。在这种启动模式下,如果你想关闭服务,可以使用停止命令:brewservicesstopmongodb-community@4.2现在,你的MongoDB数据库已经打开了。3、在操作MongoDB之前,解释一下MongoDB和mongoose中的一些核心概念。MongoDBMongoDB中的数据记录是BSON格式的文件(BSON是以二进制描述的JSON文件格式)。MongoDB将文件存储在集合中,将集合存储在数据库中。不需要手动创建MongoDB数据库和集合。集合:相当于关系数据库中的一张表。文件文档:MongoDB的数据记录单元,相当于关系数据库中的记录行。mongooseschema:在mongoose中,一切都来自一个模式,每个模式映射一个MongoDB集合,它定义了这个集合中文档的骨架。model:文件构造函数,通过编译schema得到,模型的一个实例就是一个文件,模型负责创建和读取MongoDB数据库中的文档。更多猫鼬概念可以在猫鼬指南中找到。数据库操作:1.使用mongoose连接MongoDB,在项目中创建connection.js文件//connection.js文件constmongoose=require('mongoose');constconn=mongoose.createConnection(//连接地址,MongoDB服务端口是27017//dbtest是我要使用的数据库的名字,往里面写数据的时候,MongoDB会自动创建一个名为dbtest的数据库,不需要在里面手动创建advance.'mongodb://127.0.0.1:27017/dbtest',//必须添加一些兼容配置,不写运行时会提示添加{useNewUrlParser:true,useUnifiedTopology:true})conn.on('open',()=>{console.log('打开mongodb连接');})conn.on('err',(err)=>{console.log('err:'+err);})run:nodeconection.js可以看到打印了“openmongodbconnection”,Run一直等待。这意味着你现在已经成功连接到MongoDB,你可以开始操作数据库了。为了方便扩展,我们先修改connection.js,将其导出为一个模块,这样就可以在其他地方导入复用了。//connection.js文件constmongoose=require('mongoose');constconn=mongoose.createConnection('mongodb://127.0.0.1:27017/dbtest',{useNewUrlParser:true,useUnifiedTopology:true})conn.on('open',()=>{console.log('打开mongodb连接');})conn.on('err',(err)=>{console.log('err:'+err);})module.exports=conn;//commonJs语法,导出conn模块。2.添加操作保存|create方法来创建一个新的insert.js文件//insert.jsfileletmongoose=require('mongoose');//importconnectionmoduleletconnection=require('./connection');//createschemaletStudentSchema=newmongoose.Schema({name:String,age:Number})//通过连接和模式创建模型StudentModel=connection.model('Student',StudentSchema);//通过实例化模型创建文档letstudentDoc=newStudentModel({name:'zhangsan',age:20})//将文档插入数据库,save方法返回一个Promise对象。studentDoc.save().then((doc)=>{console.log(doc)})运行:nodeinsert.js为了更直观的看到操作数据库的结果,建议安装数据库可视化工具:Robo3T,下载mac版安装。点击Robo3T左上角连接到我们的数据库后,我们可以看到MongoDB已经自动为我们生成了数据库和集合,并且插入了一条记录:也可以直接通过的create方法直接插入数据模型,返回也是一个Promise:StudentModel.create({name:'lisi',age:19}).then((doc)=>{console.log(doc)})3.读取操作查找方法为了更合理地复用代码,我们先把StudentSchema从StudentModel中提取出来:CreateanewStudentSchema.jsfile//StudentSchema.jsfileconstmongoose=require('mongoose');letStudentSchema=mongoose.Schema({name:String,age:Number})module.exports=StudentSchema;新建StudentModel.js文件//StudentModel.js文件constconnection=require('./connection');constStudentSchema=require('./StudentSchema');letStudentModel=connection.model('Student',StudentSchema);module.exports=StudentModel;然后新建一个query.js文件//query.jsfileconstStudentModel=require('./StudentModel');//丰富的查询条件,对象格式,键值对,下面是lisi记录的查询名称StudentModel.find({name:'lisi'}).then(doc=>{console.log(doc);})运行nodequery.js可以看到打印了名为lisi的记录。如果要查询整个集合://查询条件不要放查询所有记录StudentModel.find({}).then(doc=>{console.log(doc);})可以看到所有馆藏中的记录被打印出来。4.更新操作update|更新一个|updateMany方法新建一个update.js文件//update.jsfileconstStudentModel=require('./StudentModel');//update方法接收2个参数,第一个是查询条件,第二个是修改后的值//接着将lisi的记录修改为80StudentModel.update({name:'lisi'},{age:80}).then(result=>{console.log(result)})进入Robo3T,即可看到数据已经改变了,切换到表格模式更直观:但是在终端中提示DeprecationWarning:collection.updateisdeprecated。请改用updateOne、updateMany或bulkWrite。这意味着我们建议使用updateOne、updateMany或bulkWriteupdate更新所有查询结果,该方法已被弃用并已被updateMany取代。updateOne如果在查询中找到多个结果,则只更新第一条记录。upateMany更新查询的所有结果。bulkWrite提供具有可控执行顺序的批量写入操作。为了代码的健壮性,我们应该按照建议用updateMany方法替换update方法。另外,终端的输出{n:1,nModified:1,ok:1}表示:"n:1":1recordwasfound。"nModified:1":1条记录需要修改。(如果修改后的值与原值相同,需要修改0项)"ok:1":1项修改成功。5.删除操作remove|removeOne|removeMany|bulkWrite方法新建一个remote.js文件//remove.jsfileconstStudentModel=require('./StudentModel');//delete方法接收1个参数,就是querycondition//下面删除名为lisi的记录StudentModel.remove({name:'lisi'}).then((result)=>{console.log(result);});进入Robo3T,可以看到集合中没有namelisi记录:看终端的输出,和update类似,同样提示改用新方法。意思是建议我们使用removeOne、removeMany或者bulkWriteremove来删除所有的查询结果。该方法不再被推荐,已被removeMany取代。removeOne如果在查询中找到多个结果,则只删除第一条记录。removeMany从查询中删除所有结果。bulkWrite提供具有可控执行顺序的批量写入操作。另外,终端输出{n:1,ok:1,deletedCount:1}的意思和update类似,这里不再赘述。现在我们已经成功地对MongoDB数据库进行了CRUD(增、读、更新、删除)操作。干杯~更高级的操作可以参考mongooseAPI文档。4.总结整理,主要说这几个内容:Mac下node.js+MongoDB+mongoose环境搭建,注意使用最新的MongoDB安装方式。Mac下如何启动和停止MongoDB服务。介绍MongoDB和mongoose的基本核心概念。使用mongoose连接和对MongoDB进行增删改查操作。您可以使用Robo3T更直观地观察数据库。前端也可以玩玩数据库开发。欢迎交流~文章源码地址:https://github.com/yc111/mong...相关网站:Homebrew官网MongoDB官网monggose官网Robo3T官网macOSpackagemanagerHomebrewremoveMongoDB--欢迎转载,转载请注明出处:https://champyin.com/2019/10/...本文同步发表于:MongoDB+mongoosenode.js操作数据库篇|掘金
