一、Schema

schema 定义 documents的基本字段和集合;mongoose提供了Schema类

  • mongoose支持的基本类型
    String、Number、Boolean、Date、Buffer、Array、Objected、Mixed

  • mongoose设置索引
    1)在Schema filed中设置

var animalSchema = new Schema({name: String,type: String,tags: { type: [String], index: true }
});

2)在Schema.index中设置

//在Schema.index中设置animalSchema.index({ name: 1, type: -1 }); //1 表示正序, -1 表示逆序
  • mongoose连接
mongoose.connect('mongodb://user:pass@localhost:port/database', { config: { autoIndex: false } });
animalSchema.set('autoIndex', false);  //推荐
  • Schema.methods
// 添加fn
animalSchema .methods.findSimilarTypes =function(cb){// this指具体的docreturn this.model('Animal').find({ type: this.type }, cb)
}
// 该method实际上是绑定在实例的 doc上的

定义完methods和property之后, 就到了生成Model的阶段了.

只需要使用mongoose.model()即可

  • 实例Model
// 生成model类
var Animal = mongoose.model('Animal', animalSchema)
var dog = new Animal({ type: 'dog' });

Schema.methods.fn定义的方法只能new Model()实例中访问;如果想直接在Model上调用,则需要使用statics绑定Model方法

// 给model添加一个findByName方法animalSchema.statics.findByName = function (name, cb) {//这里的this 指的就是Modelreturn this.find({ name: new RegExp(name, 'i') }, cb);
}var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {console.log(animals);
});
  • Schema初始化参数
- safe 设置安全模式
var safe = true
new Schema({ .. }, { safe: safe });- 自定义安全模式
var safe = {w:"majority", wtimeout: 10000}
new Schema({ .. }, { safe: safe });- toObject
schema.set('toObject', { getters: true });
var M = mongoose.model('Person', schema);
var m = new M({ name: 'Max Headroom' });- toJSON

二、Model

  • model的创建

model的创建实际上就是方法的copy. 将schema上的方法,copy到model上. 只是copy的位置不一样, 一部分在prototype上, 一部分在constructor中

// 数据库操作
const mongoose = require('mongoose');
// 模型规则类
const { Schema } = mongoose;
// 模型规则
var CategorySchema= new Schema({ name: 'string', size: 'string' });
// 创建集合
const Category = mongoose.model('Category', CategorySchema);

Category实际在db中的collection是’Categorys’

  • model的子文档操作
// 定义schema
var childSchema = new Schema({ name: 'string' });var parentSchema = new Schema({children: [childSchema]   //指明sub-doc的schema
});
// 创建model
var Parent = mongoose.model('Parent', parentSchema);
// modedl实例
var parent = new Parent({ children: [{ name: 'Matt' }, { name: 'Sarah' }] })parent.children[0].name = 'Matthew';
parent.save(callback);
  • 子文档的CRUD
    数组操作:push,unshift, remove, pop, shift
parent.children.push({ name: 'Liesl' });// 删除
var doc = parent.children.id(id).remove();// 新增
var newdoc = parent.children.create({ name: 'Aaron' });
  • model创建
    1)实例
var Tank = mongoose.model('Tank', yourSchema);var small = new Tank({ size: 'small' });
//使用实例创建
small.save(function (err) {if (err) return handleError(err);// saved!
})

2)Model

//使用Model类创建
Tank.create({ size: 'small' }, function (err, small) {if (err) return handleError(err);// saved!
})

model的query model的查找主要提供了以下的API:find, findById, findOne, or where,返回JSON数据

  • 在mongoose中,query数据 提供了两种方式
  1. callback:使用回调函数,立即执行
Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) {if (err) return handleError(err);// get data
})
  1. query:返回Promise对象,可以使用链式调用,最后必须使用exec(cb)传入回调处理
    第一个参数必须是err,第二个参数是返回的数据
User.find({age: {$gte: 21, $lte: 65}}, callback);
//等价于:
User.where('age').gte(21).lte(65).exec(callback);

validation

monoose里的中间件

  • pre:在指定方法执行之前绑定。 中间件的状态分为 parallelseries
  • post:相当于事件监听的绑定

中间件一般仅限用于几个方法:

  • doc 方法上: init,validate,save,remove;
  • model方法上: count,find,findOne,findOneAndRemove,findOneAndUpdate,update
1. pre
// series执行, 串行
var schema = new Schema(..);
schema.pre('save', function(next) {// exe some operationsthis.model.next();  //  这里的next()相当于间执行权给下一个pre
});
在你调用 model.save方法时, 他会自动执行pre. 如果你想并行执行中间件, 可以设置为:schema.pre('save', true, function(next, done) {// 并行执行下一个中间件next();
});
2. post
schema.post('save', function(doc) {//在save完成后 触发.console.log('%s has been saved', doc._id);
});
当save方法调用时, 便会触发post绑定的save事件. 如果你绑定了多个post。 则需要指定一下中间件顺序.schema.post('save', function(doc, next) {setTimeout(function() {console.log('post1');next();}, 10);
});schema.post('save', function(doc, next) {console.log('post2');next();
});

深入理解mongoose相关推荐

  1. mongoose mysql_mongoose入门

    mongoose入门 MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表 ...

  2. Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解

    最近给项目上Typescript,记录在迁移的过程中遇到的一个问题. 问题背景 下面这段代码 定义了一个User 接口, Company接口, Order接口以及相应的mongoose model. ...

  3. node mongoose_如何使用Express,Mongoose和Socket.io在Node.js中构建实时聊天应用程序

    node mongoose by Arun Mathew Kurian 通过阿伦·马修·库里安(Arun Mathew Kurian) 如何使用Express,Mongoose和Socket.io在N ...

  4. 通过一个案例理解 JWT

    原文出自:https://www.pandashen.com JWT 简述 JWT(json web token)是为了在网络应用环境之间传递声明而基于 json 的开放标准,JWT 的声明一般被采用 ...

  5. Nodejs+Express学习二(Mongoose基础了解)

    学习Node注定少不了与数据库打交道,而MongoDB和Node可以说是绝配,这篇主要是简单介绍Mongoose这个模块. 由于本人也是边学边写的这篇文章,绝对会有新手的味道,请大神看到这里就表往下看 ...

  6. 基于Express+mongoose搭建的学生管理系统(2017-08-07)

    上一周学了下mongoose,虽然学了点皮毛,但还是想写写总结总结,这也是我的第一篇技术博客.还是蛮开心的,happy~~来,切入正题!项目源码我会放在github上. github 地址 代码目录 ...

  7. mongoose的基本使用

    开始之前,没什么比过一遍官方文档更有必要的了:http://mongoosejs.com/ mongoose 是啥?有啥用? mongoose 是操作 MongoDB 的一个对象模型库:它封装了Mon ...

  8. 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战

    一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...

  9. 应用Mongoose开发MongoDB(2)模型(models)

    数据模型及基础操作模板 为了使工程结构清晰,将数据模型(Schema, Model)的建立与增删查改的基础操作模板写在一起,命名为数据库设计中的Collection(对应于关系型数据库中的表定义)名, ...

最新文章

  1. vs2010中release模式下调试程序
  2. Java设计模式(十一):组合设计模式
  3. BZOJ 1042 [HAOI2008]硬币购物
  4. 鱼眼镜头的distortion校正【matlab】
  5. JAVA中PO,BO,VO,DTO,POJO,Entity
  6. 华为的数字化转型与数据治理
  7. Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
  8. EChart绘制风速风向曲线分析图
  9. The “QtRunWork“ task returned false but did not log an error
  10. 1. 3款免费好用的Markdown笔记应用,可以替代印象笔记
  11. 【Registration of 3D Point Clouds with Low Overlap】
  12. 鸿蒙2.0系统刷机包,鸿蒙系统2.0刷机包
  13. 【Mysql】留存率指标计算
  14. spring cloud 全家桶 简单介绍
  15. 程序或算法的时间复杂度
  16. nb移动udp_【一点资讯】华为L3 | 集采补考真题及答案 www.yidianzixun.com
  17. 命名实体识别学习记录(spaCy/OpenNLP..)
  18. 国外一些测试网站的分享
  19. 中国万网获国家信息安全应急服务资质
  20. java udp nio_Java NIO系列教程(十) Java NIO DatagramChannel

热门文章

  1. Linux Mint 20 设定静态IP地址
  2. win7 64位 Python3.5.1 scipy,numpy, Gensim主题模型包安装
  3. oracle外键约束强行insert,oracle 禁用外键约束
  4. 韦老师7天物联网课程----day5
  5. 遗传算法应用于TSP
  6. 289页初中级前端题助你拿下Offer
  7. 创作激励“姗姗来迟”,视频号“还能饭否”?
  8. 点赋科技:淘宝产品标签是在哪里?
  9. 年度重磅 | 增长黑盒2021消费品牌私域研究报告
  10. python commands_python-commands模块