当前位置: 首页 > 后端技术 > Node.js

Mongoose操作笔记

时间:2023-04-03 14:22:49 Node.js

在使用node.js的时候,经常会搭配mongoDB一起使用。通常,我们不会编写原生的mongo语法。一个经常使用的mongo库是mongoose。由于我记性不好,用过就忘记了。下面就把常用的增删改查API记录下来。安装mongoDB安装文档:mongoDB安装我在mac平台上使用brew来安装更新brew(官网上有写,其实不用,直接跳到第二步,默认会帮你更新)brewupdatebrewinstallmongodb这里其实是安装了启动输入表示启动服务mongod--config/usr/local/etc/mongod.conf一个新窗口启动mongo但是每次都是这样启动也很麻烦。我们配置一下,创建一个数据目录sudomkdir-p/data/db进入安装目录cd/usr/local/Cellar/mongodb/<这里是你安装的版本号对应的文件夹>/binrunmongodbmongod添加环境变量exportPATH=<安装路径>/bin:$PATH把<安装路径>换成你的,比如我的/usr/local/Cellar/mongodb/<这里是你安装时版本号对应的文件夹>,在其实也一样上面的路径对应的是输入的mongod。另开一个窗口,进入mongo可视化工具官网robomongo。我个人使用robomongo。当然,也有很多优秀的客户。根据个人喜好选择快速启动mongoose官网。其实大部分都在官网上写的很详细,有需要的可以参考。useconstmongoose=require('mongoose')//可以用来监控数据库状态constdb=mongoose.connection//连接数据库测试表,不存在也没关系mongoose.connect('mongodb://localhost/test',{useMongoClient:true});//用于解决警告mongoose.Promise=global.Promise;解释:{useMongoClient:true}用于解决以下警告(点头e:2772)DeprecationWarning:open()在mongoose>=4.11.0中被弃用,请改用openUri(),或者如果使用connect()或createConnection()则设置useMongoClient选项。见http://mongoosejs.com/docs/co...创建Schema,见SchemaconstSchema=mongoose.Schema;//定义表模型的数据类型//requiredmustreceiveabooleanorfunctionconstblogSchema=newSchema({title:{type:String,required:true},author:String,age:{type:Number,min:18,max:65},comments:[{body:String,date:Date}],date:{type:Date,default:Date.now},//defaultdefault当前时间戳hidden:Boolean,meta:{votes:Number,favs:Number}});支持的类型StringNumberDateBufferBooleanMixedObjectIdArray创建modelvarBlog=mongoose.model('Blog',blogSchema);注意:在文档中,声明使用该方法时不要使用箭头函数创建文档。通过以上步骤,表格模型实际上已经创建完成。创建文档并将其保存到数据库非常简单。增删改查查询方式一:varTank=mongoose.model('Tank',yourSchema);varsmall=newTank({size:'small'});小的。save(function(err,doc){if(err)returnhandleError(err);console.log(doc)})create:Model.create(doc(s),[callback])Tank.create({size:'small'},function(err,small){if(err)returnhandleError(err);console.log(small._doc)})Model.insertMany(doc(s),[options],[options.ordered,[options.rawResult,[callback])这个方法比循环创建更快,因为它只发送一个操作变量到服务器arr=[{name:'StarWars'},{name:'TheEmpireStrikesBack'}];Movies.insertMany(arr,function(error,docs){});RemoveTank.remove({size:'large'},function(err){if(err)returnhandleError(err);});删除Tank表中大小较大的数据并更改(更新)update:Model.update(conditions,doc,[options],[callback])parameterconditionsqueryconditiondocdocumenttobeupdate[options]option[callback]回调函数注意:不能修改主键_idoptions有以下选项:safe(boolean):defaultFortrue安全模式。upsert(boolean):默认为false。如果不存在则创建一个新记录。multi(boolean):默认为false。是否更新多条查询记录。runValidators:如果值为true,则执行Validation验证。setDefaultsOnInsert:如果upsert选项为true,则在新建时插入文档中定义的默认值。strict(boolean):在严格模式下更新。覆盖(布尔值):默认为假。禁用仅更新模式,允许覆盖记录示例MyModel.update({name:'Tobi'},{ferret:true},{multi:true},function(err,raw){if(err)returnhandleError(err);console.log('TherawresponsefromMongowas',raw);});更新多个名为Tobi的文档将ferret设置为trueModel.updateMany更新多个数据与更新Model.updateOne更新一个数据集multiInvalidfindfind:Model.find(conditions,[projection],[options],[callback])conditions:查询条件;投影:控制返回的字段;选项:控制选项;回调:回调函数。Example//Namejohnage大于或等于18,只返回title和author字段跳过10项MyModel.find({name:'john',age:{$gte:18}},{title:1,author:1},{skip:10},function(err,docs){});//在thenvarquery=MyModel.find({name:/john/i},null,{skip:10})query.exec(function(err,docs){});findOne:Model.findOne([conditions],[projection],[options],[callback])使用方法和find一样,只是返回第一个查询记录findById:Model.findById(id,[projection],[options],[callback])根据_id字段查询相关查询详见mongoDB比较查询运算符$gt大于(>)$lt小于(<)$gte大于等于(>=)$lte小于等于(<=)$eq等于(=)$ne不等于(!=)$in一个key对应多个值(数组中)Model.find({qty:{$in:[5,15]}})//查询qty等于5或15的文档$nin同上,key不对应指定value。逻辑查询运算符$or多条件匹配,$in可以嵌套使用Model.find({$or:[{quantity:{$lt:20}},{price:10}]})//查询数量的文档小于20或者其价格等于10$norNegate同上$notnoteligibleDocumentationModel.find({price:{$not:{$gt:1.99}}})//$andandandandothercommonly如果价格不大于1.99,则使用运算符限制指定的回报最大项目数Query#limit(val)query.limit(20)skip指定跳过的项目数,常用于分页公式skip=(page-1)*pageSize;Query#skip(val)query.skip(100).limit(20)sortsort降序-1升序1Query#sort(arg)query.sort({test:-1});//降序排序查询