Node进阶第七天

一、复习

一、索引

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

explain来查看这个寻找过程。

这个语句,能够查看检索的过程。

建立索引,索引建立之后是2的原因是id也是索引。

这样,今后通过name寻找student文档的时候,速度非常快,因为能够快速的从索引表中,找到这个文档。

缺点就是插入每条数据的时候,事件变慢了,效率低了。但是换回来的就是寻找的速度快。

索引这个属性,所有文档都不能相同。

{unique:true}

二、Mongoose

是一个将Javascript对象与数据库产生关系的一个框架,object related model。操作对象,就是操作数据库了;对象产生了,同时也持久化了。

这个思路是Java三大框架SSH中Hibernate框架的思路。彻底改变了人们使用数据库的方式。

http://www.mongoose.com

//引包,并不需要引用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的更多相关文章

  1. Node_进阶_8

    Node进阶第八天 一.复习 Node.js特点:单线程.异步I/O(非阻塞I/O).事件驱动(事件环). 适合的程序:就是没有太多的计算,I/O比较多的业务. 举例:留言本.考试系统.说说.图片裁切 ...

  2. Node_进阶_6

    Node进阶第六天 一.复习 cookie是在res中设置,req中读取的.第一次的访问没有cookie. cookie的存储大小有限,kv对儿.对用户可见,用户可以禁用.清除cookie.可以被篡改 ...

  3. Node_进阶_5

    Node进阶第五天 为什么mysql不用开mongod –dbpath xx… 答:因为mysql会在”服务”中运行,也就是开机时自动启动并且长久驻扎在内存中了. mongodb其实也能通过设置来设成 ...

  4. Node_进阶_4

    Node进阶第四天 一.传统数据库技术回顾 数据库就是存储数据的,那么存储数据用txt就行了啊,为什么要有数据库? 理由之一:数据库有行.列的概念,数据有关系,数据不是散的. 老牌数据库,比如Mysq ...

  5. React-Native进阶_7.TextInput的使用实现搜索功能

    前面使用TabBar 实现了底部tab标签,通过stackNavigator 实现了页面跳转,接下来,使用TextInput 来实现一个搜索功能. TextInput 属性比较多,不一一介绍,具体可以 ...

  6. Node_进阶_2

    第二天 一.复习: Node.js开发服务器.数据.路由.本地关心效果,交互. Node.js实际上是极客开发出的一个小玩具,不是银弹.有着别人不具备的怪异特点: 单线程.非阻塞I/O.事件驱动. 实 ...

  7. Node_进阶_1

    第一天 1.1简介 Node.js简介 V8引擎本身就是用于Chrome浏览器的JS解释部分,Ryan Dahl把这个V8搬到了服务器上,用于做服务器的软件. Node.js是一个让Javascrip ...

  8. Node_进阶_3

    Express框架: 一.   Express框架 Express框架是后台的Node框架,类似于JS中的jquery. #原生Node开发会有很多问题: 1呈递静态页面很不方便,需要处理每个HTTP ...

  9. PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)

    content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...

随机推荐

  1. windows下git server搭建

    使用gitblit1.8搭建 首先要安装JDK 然后下载gitblit,这里给一个CSDN下载 https://download.csdn.net/download/nietzsche0/104826 ...

  2. linux C++ 编译错误 file not found 其实是原文件后缀的问题

    gcc和clang会根据源文件的后缀.c或者.cpp判断原文件类型,采取不同的编译策略,所以我使用它们编译后缀是.c的C++原文件的时候会出现找不到include的文件的错误,使用正确的后缀名即可.同 ...

  3. Day 03 知识点[python程序运行的方式、变量、注释、内存管理、数据类型]

    执行Python程序的两种方式 第一种:交互式,在cmd中运行 优点:调试程序方便,直接给出结果 缺点:无法保存,关掉cmd窗口数据就消失 第二种:命令行式通过cmd中输入Python3文本 优点:数 ...

  4. vue安装以及配置

    今天又重新做了一遍vue的安装步骤: 1.条件,vue需要安装在node环境里面,确保安装了node. 2.安装脚手架. 找一个文件夹,放你的项目.待会儿安装的时候,项目会在你找的这个文件下新增一个你 ...

  5. 窗口管理工具 screen

    简介 Screen是一款用于命令行终端切换的自由软件 用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换 GNU Screen可以看作是窗口管理器的命令行界面版本 它提供了统一的管 ...

  6. http://my.oschina.net/joanfen/blog/160156

    http://my.oschina.net/joanfen/blog/160156 http://code4app.com/ios/iOS7-Sampler/5254b2186803faba0d000 ...

  7. SpringBoot 消费NSQ消息

    使用监听器,来实现实时消费nsq的消息 一.目前spring boot中支持的事件类型如下 ApplicationFailedEvent:该事件为spring boot启动失败时的操作 Applica ...

  8. 命令行 对MYSQL导入sql

    1 use database name;  //选择使用的数据库 2 mysql>source d:\datafilename.sql  导入sql

  9. 【henuacm2016级暑期训练-动态规划专题 B】Coloring Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[i][j][k]前i个位置,第i个位置放j这个颜色,然后形成了k个联通块的最小花费 分第i个位置有没有已经放颜色两种情况考虑. ...

  10. [Hyperapp] Interact with the State Object through Hyperapp Action functions

    Hyperapp is an ultra lightweight (1kb), minimal, functional, JavaScript library for building UIs. It ...