码迷,mamicode.com
首页 > 数据库 > 详细

mongoose包操作mongoDB

时间:2017-12-01 20:43:21      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:efi   mod   回调   分页   自定义   属性   对象   date   validate   

阅读此文需要有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)
    }
})

  

mongoose包操作mongoDB

标签:efi   mod   回调   分页   自定义   属性   对象   date   validate   

原文地址:http://www.cnblogs.com/zhouxiaohouer/p/7944129.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!