Node_进阶_7
Node进阶第七天
一、复习
一、索引
数据库中,根据一个字段的值,来寻找一个文档,是很常见的操作。比如根据学号来找一个学生。这个学号是唯一的。只要有学号,就能唯一确认一个学生的文档。学号这个属性,就非常适合建立索引。这样查找就非常简单了。

explain来查看这个寻找过程。
这个语句,能够查看检索的过程。
建立索引,索引建立之后是2的原因是id也是索引。

这样,今后通过name寻找student文档的时候,速度非常快,因为能够快速的从索引表中,找到这个文档。
缺点就是插入每条数据的时候,事件变慢了,效率低了。但是换回来的就是寻找的速度快。
索引这个属性,所有文档都不能相同。
{unique:true}
二、Mongoose
是一个将Javascript对象与数据库产生关系的一个框架,object related model。操作对象,就是操作数据库了;对象产生了,同时也持久化了。
这个思路是Java三大框架SSH中Hibernate框架的思路。彻底改变了人们使用数据库的方式。
//引包,并不需要引用mongodb这个包
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Cat = mongoose.model('Cat', { name: String });
const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
上面的代码中,没有一个语句是明显的操作数据库,感觉都在创建类、实例化类、调用类的方法,都是在操作对象,但是数据库同步被持久了。
创建一个模型
mongoose.model(‘模型名字’,{“name”:String,”age”:Integer});
就可以被实例化
var kitty = new Cat({name:’ZildJian’});
然后这个实例就可以被save。
来个实例
db.js:
//引包
const mongoose = require('mongoose');
//创建数据库连接
var db = mongoose.createConnection('mongodb://localhost/hoho');
//监听open事件
db.once('open', function (callback) {
console.log('数据库成功连接');
});
//向外暴露db对象
module.exports = db;
student.js:
var mongoose = require('mongoose');
var db = require('./db');
//创建了一个schema结构。
var studentSchema = new mongoose.Schema({
name: { type: String },
age: { type: Number },
sex: { type: String }
});
//创建了一个模型,就是学生模型,就是学生类。
//类是基于schema创建的。
var studentModel = db.model('mongoose', studentSchema);
//向外暴露
module.exports = studentModel;
基于类的方法(之前是基于对象的方法):
db.js:
//引包
const mongoose = require('mongoose');
//创建数据库连接
var db = mongoose.createConnection('mongodb://localhost/hoho');
//监听open事件
db.once('open', function (callback) {
console.log('数据库成功连接');
});
//向外暴露db对象
module.exports = db;
student.js:
var mongoose = require('mongoose');
var db = require('./db');
//创建了一个schema结构。
var studentSchema = new mongoose.Schema({
name: { type: String },
age: { type: Number },
sex: { type: String }
});
//创建静态方法
studentSchema.statics.zhaoren = function (name, callback) {
return this.model('student').find({ name: name }, callback);
}
//创建修改的静态方法
studentSchema.statics.xiugai = function (conditions, update, options, callback) {
this.model('student').update(conditions, update, options, callback);
}
//创建了一个模型,就是学生模型,就是学生类
//类是基于schema创建的。
var studentModel = db.model('student', studentSchema);
//向外暴露
module.exports = studentModel;
app.js:
//定义了一个模型,学生模型,"学生类"
var Student = require('./models/student');
/*
//实例化了一个学生类
var xiaoming = new Student({"name":"小明","age":12,"sex":"男"})
//保存这个学生类 这个save是一个基于对象的操作
xiaoming.save(function(){
console.log('存储成功');
});
*/
//这是一个基于类的操作,表现力更加丰富(工厂)
// Student.create({
// 'name': '小红',
// 'age': 13,
// 'sex': '女'
// }, (err) => {
// console.log('保存成功');
// });
Student.zhaoren('小红', function (err, result) {
console.log(result);
});
Student.xiugai({ "name": "小红" }, { $set: { "age": 30 } }, {}, function () {
console.log('改年龄成功');
});
//我命令的是student类,没有命令db,并不是直接操作数据库的语句。
mongoose首先要想明白一件事儿,所有的操作都不是对数据库尽心地。所有地操作都是对类或者对象来操作的,数据库的持久化自动完成了。
创造schema->定义一些schema的静态方法->创造模型
创造schema用什么语句? new mongoose.schema({});
创造模型用什么语句?db.model(“Student”,schema 名字);
前台界面:不操作数据库,只操作类!
图书管理系统
借助mongoose做一个图书管理系统。

db.js:
//引包
const mongoose = require('mongoose');
//创建数据库连接
var db = mongoose.createConnection('mongodb://localhost/hoho');
//监听open事件
db.once('open', function (callback) {
console.log('数据库成功连接');
});
//向外暴露db对象
module.exports = db;
student.js:
var mongoose = require('mongoose');
var db = require('./db');
//创建了一个schema结构。
var studentSchema = new mongoose.Schema({
name: { type: String },
age: { type: Number },
sex: { type: String }
});
//创建静态方法
studentSchema.statics.zhaoren = function (name, callback) {
return this.model('student').find({ name: name }, callback);
}
//创建修改的静态方法
studentSchema.statics.xiugai = function (conditions, update, options, callback) {
this.model('student').update(conditions, update, options, callback);
}
//创建了一个模型,就是学生模型,就是学生类
//类是基于schema创建的。
var studentModel = db.model('student', studentSchema);
//向外暴露
module.exports = studentModel;
app.js:
//定义了一个模型,学生模型,"学生类"
var Student = require('./models/student');
/*
//实例化了一个学生类
var xiaoming = new Student({"name":"小明","age":12,"sex":"男"})
//保存这个学生类 这个save是一个基于对象的操作
xiaoming.save(function(){
console.log('存储成功');
});
*/
//这是一个基于类的操作,表现力更加丰富(工厂)
// Student.create({
// 'name': '小红',
// 'age': 13,
// 'sex': '女'
// }, (err) => {
// console.log('保存成功');
// });
Student.zhaoren('小红', function (err, result) {
console.log(result);
});
Student.xiugai({ "name": "小红" }, { $set: { "age": 30 } }, {}, function () {
console.log('改年龄成功');
});
//我命令的是student类,没有命令db,并不是直接操作数据库的语句。
Node_进阶_7的更多相关文章
- Node_进阶_8
Node进阶第八天 一.复习 Node.js特点:单线程.异步I/O(非阻塞I/O).事件驱动(事件环). 适合的程序:就是没有太多的计算,I/O比较多的业务. 举例:留言本.考试系统.说说.图片裁切 ...
- Node_进阶_6
Node进阶第六天 一.复习 cookie是在res中设置,req中读取的.第一次的访问没有cookie. cookie的存储大小有限,kv对儿.对用户可见,用户可以禁用.清除cookie.可以被篡改 ...
- Node_进阶_5
Node进阶第五天 为什么mysql不用开mongod –dbpath xx… 答:因为mysql会在”服务”中运行,也就是开机时自动启动并且长久驻扎在内存中了. mongodb其实也能通过设置来设成 ...
- Node_进阶_4
Node进阶第四天 一.传统数据库技术回顾 数据库就是存储数据的,那么存储数据用txt就行了啊,为什么要有数据库? 理由之一:数据库有行.列的概念,数据有关系,数据不是散的. 老牌数据库,比如Mysq ...
- React-Native进阶_7.TextInput的使用实现搜索功能
前面使用TabBar 实现了底部tab标签,通过stackNavigator 实现了页面跳转,接下来,使用TextInput 来实现一个搜索功能. TextInput 属性比较多,不一一介绍,具体可以 ...
- Node_进阶_2
第二天 一.复习: Node.js开发服务器.数据.路由.本地关心效果,交互. Node.js实际上是极客开发出的一个小玩具,不是银弹.有着别人不具备的怪异特点: 单线程.非阻塞I/O.事件驱动. 实 ...
- Node_进阶_1
第一天 1.1简介 Node.js简介 V8引擎本身就是用于Chrome浏览器的JS解释部分,Ryan Dahl把这个V8搬到了服务器上,用于做服务器的软件. Node.js是一个让Javascrip ...
- Node_进阶_3
Express框架: 一. Express框架 Express框架是后台的Node框架,类似于JS中的jquery. #原生Node开发会有很多问题: 1呈递静态页面很不方便,需要处理每个HTTP ...
- PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)
content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...
随机推荐
- Book 树状数组 小结
差不多花了10天学树状数组,是照着这篇博客做的题目,还差几道---------- http://blog.csdn.net/chenguolinblog/article/details/9916229 ...
- ZOJ 3019 Puzzle
解题思路:给出两个数列an,bn,其中an,bn中元素的顺序可以任意改变,求an,bn的LCS 因为数列中的元素可以按任意顺序排列,所以只需要求出an,bn中的元素有多少个是相同的即可. 反思:一开始 ...
- 细数ZBrush这些年的心路历程
ZBrush 的出现,带来了一场3D造型的革命.它完全颠覆了传统三维设计工具的工作模式,将3D空间绘图这种全新的设计理念呈现在广大设计师面前,强大的雕塑建模功能和颜色绘制功能释放了艺术家的灵感,让设计 ...
- day06-1 与用户交互以及格式化输出
目录 Python的与用户交互 Python2的input和raw_input(了解) 格式化输出 占位符 format函数格式化字符串 f-string格式化(方便) Python的与用户交互 in ...
- [国家集训队2009]小Z的袜子
题目:洛谷P1494.BZOJ2038. 题目大意:给你一列袜子的颜色,每次要你求从区间$[L,R]$内随机选两个袜子颜色相同的概率.解题思路:首先,对于某个特定区间$[L,R]$,它的概率是$\fr ...
- vue 阿里云上传组件
vue 阿里云上传组件 Vue.js上传图片到阿里云OSS存储 测试项目git地址 本测试项目启动方法 示例链接 组件配置项 实践解释 本文主要介绍如何 在vue项目中使用web 直传方式上传阿里云o ...
- JS中常用开发知识点
JS中常用开发知识点 1.获取指定范围内的随机数 2.随机获取数组中的元素 3.生成从0到指定值的数字数组 等同于: 4.打乱数字数组的顺序 5.对象转换为数组 //注意对象必须是以下格式的才可以通 ...
- ASP.NET-前台view返回model集合
有时操作列表的时候想一次提交一个model集合,这样后台controller直接接受后就可以直接进行操作了,不用使用js,比较方便,也体现了MVC的Binding模式的优势,方法如下: 准备: 1.两 ...
- 【IPC进程间通讯之三】内存映射文件Mapping File
IPC进程间通信+共享内存Mapping IPC(Inter-Process Communication.进程间通信). 文件映射(Mapping)是一种 ...
- iOS企业证书网页分发全过程具体解释(图文并茂史无前例的具体哦)
iOS企业证书网页分发全过程具体解释 苹果的企业级证书公布的应用.是不用设备授权就可以直接安装,而且不限设备上限. 为了方便分发,苹果有协议实现通过网页链接直接下载安装企业级的应用. 首先须要说明它的 ...