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

Mongoose简介API

时间:2023-04-03 10:22:17 Node.js

Mongoose是一个方便在node.js环境下运行mongodb的对象模型工具。因此,要使用mongoose,必须安装node.js环境和mongodb数据库。mongoose让mongodb操作变得更加简单方便。你可以在github中获取它的源码,也可以在这里查看api文档。它是英文的,内容很多。因此,本文特意总结了mongoose的schema数据模型定义和简单的增删改查api。connectconnect用于创建数据库连接mongoose.connect(uri(s),[options],[callback])//url(s):数据库地址,可以多个,用`,`分隔//options:optional,配置参数//callback:可选,回调mongoose.connect('mongodb://数据库地址(含端口号)/数据库名')指定用户连接mongoose.connect('mongodb://用户名:password@127.0.0.1:27017/数据库名')连接多个数据库如果你的app想连接多个数据库,只需要设置多个url,用.分隔,设置mongos为truemongoose.connect('urlA,urlB,..',{mongos:true})schema&&modelSchema是以文件形式存储的数据库模型骨架,不具备操作数据库的能力。Schema可以理解为mongoose对表结构的定义(不仅可以定义文档的结构和属性,还可以定义文档实例方法、静态模型方法、复合索引等),每个schema都会映射到一个集合中mongodb,Schema不具备操作数据库的能力定义Schema//语法newmongoose.Schema({field...},[options])//Instanceconstmongoose=require('mongoose')constSchema=mongoose.SchemaconstObjectId=架构。Types.ObjectIdconstArticleSchema=newSchema({标题:{类型:String,required:true},contents:String,author:String,category:{type:ObjectId,ref:'Category'//与类别表关联的_id},createTime:{type:Date,default:Date.now}},{connection:'Article',//模型名称,})字段类型schema支持以下字段类型StringNumberDateBufferBooleanMixedObjectIdArrayschema不仅可以设置字段类型,还可以设置默认值(default),关联文档(参考),需要等待。_设置字段类型后,如果出现错误,比如某个字段类型是Boolean,输入其他类型,mongoose会抛出类型错误提示_options//`collection`是常用的,其他的请参考to[documentation](http://www.nodeclass.com/api/mongoose.html#index_Mongoose-Schema){_id:true,//布尔值,唯一索引,如果不需要,可以设置为false关闭集合:'documentname',//在MongDB中,默认使用Model的名字作为集合的名字。如果需要自定义集合的名字,可以设置这个选项对批量操作有效,用于限制数据库操作id的数量,//mongoose为每个schema分配一个虚拟属性id,是一个getter。返回的是_id转换成字符串的值read,safe,shardKey,strict,toJSON,toObject}ModelModel是一个假设的(花哨的)具有抽象属性和行为的构造函数。模型的每个实例都是一个文档。文档可以保存到数据库中,并对数据库进行操作。//语法mongoose.model(`DocumentName`,Schema)//实例module.exports=mongoose.model(`Article`,ArticleSchema)MethodsModel的实例方法是document。save等内置实例方法,可以通过methods属性ArticleSchema.methods.methodFunc=function(){//body...}为实例自定义扩展方法,比如find、update等,可以通过statics属性为Model添加自定义扩展方法ArticleSchema.statics.staticFunc=function(){//body...}Methods和Statsstatics的区别是向模型添加方法,而方法就是向实例(instance)添加方法。方法和静态的区别//上面的代码,//module.exports=mongoose.model(`Article`,ArticleSchema)//将文章的模型保存为文件article.jsconstArticle=require('../models/article')//staticsArticle.staticFunc()//methodsconstarticle=newArticle(arguments)article.methodFunc()findfind用于查询多个文档Model.find(conditions,[fields],[options],[callback])conditions//查询条件[fields]//需要查询的字段[options]//查询配置参数[callback]//回调条件查询conditionsquery查询中常用的属性$oror关系$nor    或关系否定$gt    大于$gte    大于等于$lt    小于$lte    小于等于to$ne    不等于$in    在多个值范围内$nin    不在多个值范围内$all    匹配多个值在数组$regex    正则,用于模糊查询$size    匹配数组大小$maxDistance    范围查询,距离(基于LBS)$mod    取模运算$near    邻域查询,查询附近位置(基于LBS)$exists    字段存在$elemMatch    匹配内部数组中的元素$within    范围查询(基于LBS)$box    范围查询,矩形范围(基于onLBS)$center    rangewakeupquery,circularrange(basedonLBS)$centerSphere    rangequery,sphericalrange(basedonLBS)$slice    查询字段集合中的元素(比如从第N到第M个元素,如果要查询阅读量大于500小于600的文章Article.find({views:{$gte:500,$lte:600}})options参考这篇文档findByIdfindById用于通过id查询单个文档Model.findById(id,[fields],[options],[callback])findOnefindOne用于查询一个singledocumentbyconditionModel.findOne(conditions,[fields],[options],[callback])populatepopulate用于查看关联文档的内容,即查询与字段集关联的文档的相关字段withrefModel.populate(docs,options,[cb(err,doc)])//exampleyieldArticle.findOne({_id:id},{title:1,author:1}).populate('category',{select:{name:1,_id:1}})//查找_id为id的文章类别字段对应的类别表中的类别名称和id//多个关联表需要使用数组yieldArticle。findOne({_id:id},{title:1,author:1}).populate([{path:'comments',//文章的评论字段select:{_id:1,user:1,text:1,},},{path:'category'//文章的分类字段,select:{fields...}}])分页排序yieldArticle.findOne({_id:id},{title:1,作者:1},{sort:{createTime:-1,//倒序desc_id:-1},skip:(page-1)*pageSize,//page:当前页码,pageSize每页显示的项目数limit:pageSize})//sort:-1=>desc,a=>asc模糊查询,参考博文《MONGOOSE 多条件模糊查询的实现》countcount方法用于统计符合条件的文档集合总数Model.count(conditions,[callback])updateModel.update(conditions,update,[options],[callback])//查找并更新Model.findByIdAndUpdate(id,[update],[options],[callback])Model.findOneAndUpdate([conditions],[update],[options],[callback])UpdateModifier`$inc`自增修饰符,只对数字有效。Article.update({_id:id},{$inc:{views:1}})//找到id=_id的记录,对views进行自增,返回的views为之前的views+1。ps:这个属性对于直接增减数字非常有用。用于更新一些数字(例如读数)`$set`指定字段的值,如果不存在则创建它。可以是MondoDB支持的任何类型。Article.update({_id:id},{$set:{views:51,title:'modifiedtitle'...}})//更新views为51,title为'modifiedtitle'`$unset`同上面,删除一个字段Article.update({views:50},{$unset:{views:'remove'}})//执行后:views字段没有可选参数,第三个参数{new:true,//true:返回更新后的文档,false:返回更新前的文档,默认为falsesort:null,//排序条件,同sort函数的参数真挚地。fields:null,//要返回的字段,与find*的第二个参数一致。upsert:null,//如果为true,表示如果没有匹配查询选择器的文档,mongo会根据第一个和第二个参数向集合中插入一个新文档multi:false,//true:Updateallmatcheddocumentsdocument,false:更新第一个匹配到的文档}savesave是一个实例方法,需要先用newModel()获取实例constarticle=newArticle({//field=>value//...})yieldarticle.save()removeModel.remove(conditions,[callback])//查找并删除Model.findByIdAndRemove(id,[options],[callback])Model.findOneAndRemove(conditions,[options],[callback])总结以上只是对mongoose文档的最简单的使用总结,比如where方法或者对数组的操作不包括在内,主要使用官方文档