深入理解mongoose
一、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数据 提供了两种方式
- callback:使用回调函数,立即执行
Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) {if (err) return handleError(err);// get data
})
- 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:在指定方法执行之前绑定。 中间件的状态分为
parallel
和series
- 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相关推荐
- mongoose mysql_mongoose入门
mongoose入门 MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表 ...
- Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解
最近给项目上Typescript,记录在迁移的过程中遇到的一个问题. 问题背景 下面这段代码 定义了一个User 接口, Company接口, Order接口以及相应的mongoose model. ...
- node mongoose_如何使用Express,Mongoose和Socket.io在Node.js中构建实时聊天应用程序
node mongoose by Arun Mathew Kurian 通过阿伦·马修·库里安(Arun Mathew Kurian) 如何使用Express,Mongoose和Socket.io在N ...
- 通过一个案例理解 JWT
原文出自:https://www.pandashen.com JWT 简述 JWT(json web token)是为了在网络应用环境之间传递声明而基于 json 的开放标准,JWT 的声明一般被采用 ...
- Nodejs+Express学习二(Mongoose基础了解)
学习Node注定少不了与数据库打交道,而MongoDB和Node可以说是绝配,这篇主要是简单介绍Mongoose这个模块. 由于本人也是边学边写的这篇文章,绝对会有新手的味道,请大神看到这里就表往下看 ...
- 基于Express+mongoose搭建的学生管理系统(2017-08-07)
上一周学了下mongoose,虽然学了点皮毛,但还是想写写总结总结,这也是我的第一篇技术博客.还是蛮开心的,happy~~来,切入正题!项目源码我会放在github上. github 地址 代码目录 ...
- mongoose的基本使用
开始之前,没什么比过一遍官方文档更有必要的了:http://mongoosejs.com/ mongoose 是啥?有啥用? mongoose 是操作 MongoDB 的一个对象模型库:它封装了Mon ...
- 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战
一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...
- 应用Mongoose开发MongoDB(2)模型(models)
数据模型及基础操作模板 为了使工程结构清晰,将数据模型(Schema, Model)的建立与增删查改的基础操作模板写在一起,命名为数据库设计中的Collection(对应于关系型数据库中的表定义)名, ...
最新文章
- vs2010中release模式下调试程序
- Java设计模式(十一):组合设计模式
- BZOJ 1042 [HAOI2008]硬币购物
- 鱼眼镜头的distortion校正【matlab】
- JAVA中PO,BO,VO,DTO,POJO,Entity
- 华为的数字化转型与数据治理
- Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
- EChart绘制风速风向曲线分析图
- The “QtRunWork“ task returned false but did not log an error
- 1. 3款免费好用的Markdown笔记应用,可以替代印象笔记
- 【Registration of 3D Point Clouds with Low Overlap】
- 鸿蒙2.0系统刷机包,鸿蒙系统2.0刷机包
- 【Mysql】留存率指标计算
- spring cloud 全家桶 简单介绍
- 程序或算法的时间复杂度
- nb移动udp_【一点资讯】华为L3 | 集采补考真题及答案 www.yidianzixun.com
- 命名实体识别学习记录(spaCy/OpenNLP..)
- 国外一些测试网站的分享
- 中国万网获国家信息安全应急服务资质
- java udp nio_Java NIO系列教程(十) Java NIO DatagramChannel
热门文章
- Linux Mint 20 设定静态IP地址
- win7 64位 Python3.5.1 scipy,numpy, Gensim主题模型包安装
- oracle外键约束强行insert,oracle 禁用外键约束
- 韦老师7天物联网课程----day5
- 遗传算法应用于TSP
- 289页初中级前端题助你拿下Offer
- 创作激励“姗姗来迟”,视频号“还能饭否”?
- 点赋科技:淘宝产品标签是在哪里?
- 年度重磅 | 增长黑盒2021消费品牌私域研究报告
- python commands_python-commands模块