阅读此文需要有mongoDB的基础知识 在nodejs里操作mongo数据库 先了解几个概念: mongodb和mongoose mongodb包是为程序提供的一个驱动来操作mongoDB数据库 mongoose包是基于mongodb构建的一个对象操作模型,适用于nodejs mongoose中比较重要的三个概念: Schema,用来定义数据库的结构,比如key的数据类型,文档里都有哪些key,key的value值都有哪些特征等。schema不具备操作数据库的能力。 Model,由schema编译出的构造器,用来定义集合模型,Model的实例即是文档。model具备数据库的增删改查。 Entity,由model构造器创建的实体,即文档document。 var mongoose = require('mongoose') 连接数据库user mongoose.connect("mongodb://127.0.0.1:27017/user") 定义schema var userSchema = new mongoose.Schema({ id:Number, name:{reuired:true,default:'undefined',match:/a/}, age:Number }) schema还可以细化key的其他属性,即文档验证,通过文档验证的文档才会被保存,反正则不会保存,还会报错。 type:数据类型,如Number,String required: true数据必须填写, false非必须数据 default: 默认值 validate: 自定义匹配,值是自定义函数,返回值是布尔值,true通过,false不通过 min: 最小值(只适用于数字) max: 最大值(只适用于数字) match: 正则匹配(只适用于字符串) enum: 枚举匹配(只适用于字符串) 定义model,其中testco即是集合名 var userModel = mongoose.model('testco',userSchema) 生成entity var doc = new userModel({ id:1, name:'aa', age:23 }) 定制化的schema需要new mongoose.Schema() model则是调用mongoose.model() 定制化entity则需要new model() 在mongo的shell后台里,操作方法基本都是在集合下调用,mongoose也是如此,model充当的集合的角色,自然也是在它下操作数据库。 参考链接:http://www.nodeclass.com/api/mongoose.html#model-js 增 Model.create(doc(s),(err,doc(s))=>{}) eg. userModel.create({id:2,name:"bb",age:33},{id:3,name:"cc",age:3},(err,doc1,doc2)=>{ console.log(doc1) //{id:2,name:"bb",age:33} console.log(doc2) //{id:3,name:"cc",age:3} }) new Model(doc).save() eg. new userModel({id:1,name:'aa',age:23}).save() 删 在model上删文档 Model.remove(conditions,(err,doc)=>{}) 在文档上删文档 eg. Model.find({id:{$lte:5}},(err,docs)=>{ docs.remove() }) 改 Model.update(conditions,update,(err,raw)=>{}) 查 Model.find(conditions, [fields], [options], [(err,docs)=>{}]) 参数:查询条件,控制返回的字段(字段筛选),配置查询参数,回调函数 conditions查询条件参考mongo语法,比如$lte:32之类的 fields即是控制返回数据的字段,就是说你想要哪些key,想要返回name就写'name',此时默认会返回_id值,写成{name:1,_id:0}即可 options配置查询参数,比如做分页的时候{limit:20}表示返回20条数据(不足返回全部) callback中err表示查询错误,docs表示返回的结果 .findOne()表示返回数据中的第一条,.findById()表示根据obj.id查找 查询后操作 sort 排序 skip 跳过 limit 限制 select 显示字段 exec 执行 id降序,age升序排序 Model.find().sort('-id age').exec((err,docs)=>{}) 跳过前三条数据 Model.find().skip(3).exec((err,docs)=>{}) 只显示13条数据 Model.find().limit(13).exec((err,docs)=>{}) 只显示name age字段,不显示id Model.find().select('name age -id').exec((err,docs)=>{}) 以上可以连起来写,查找到的数据按id降序age升序,跳过前3,只显示13条,每条数据只显示name,age字段,不显示id Model.find().sort('-id age').skip(3).limit(13).select('name age -id').exec((err,docs)=>{ console.log(docs) }) 分页小例子: 定义页码,定义每页多少条,定义 let page = req.param('page') let pageSize = 20 let skip = (page-1)*pageSize model.find().skip(skip).limit(pageSize).exec((err,docs)=>{ if (err) { data.push({ status = 1, msg:'数据错误' }) }else{ data.push(doc) } })