jQuery性能优化
- 1.对于在jQuery中重复使用的标签,在第一次选择的时候就用一个变量把它保存起来。
- 2.在使用类名选择器时,加上父级选择器(父级选择器使用id或标签名)
- 3.使用find方法来选取后代
- 4.尽量使用jquery中的链式写法
- 5.使用事件委托
数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
MongoDB简介
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个高性能,开源,无模式的文档型数据库,官方给自己的定义是Key-value存储(高性能和高扩展)和传统RDBMS(丰富的查询和功能)之间的一座桥梁。
Document & BSON
MongoDB中保存的数据格式为BSON,如:
{
name: "sue",
age: 26,
status: "A",
groups: [ "news", "sports" ]
}
MongoDB中数据的基本单元称为文档(Document
),它是MongoDB的核心概念,由多个键极其关联的值有序的放置在一起组成,数据库中它对应于关系型数据库的行。 数据在MongoDB中以BSON
(Binary-JSON
)文档的格式存储在磁盘上。 BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON,BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date
和BinData
类型。 BSON的优点是灵活性高,但它的缺点是空间利用率不是很理想。 BSON有三个特点:轻量性、可遍历性、高效性。
创建数据库
use
命令可以用来创建一个新的数据库,也可以切换到一个已经存在的数据库:
use DATABASE_NAME
如果想查看当前所有数据库的列表,可以使用命令:
show dbs
如果想删除当前所使用的数据库,可以使用命令:
db.dropDatabase()
创建集合
可以使用createCollection
方法来创建集合。
语法
db.createCollection(name, options)
参数说明
| 参数 | 类型 | 描述 | | --- | --- | --- | | Name
| String | 要创建的集合名称 | | Options
(可选) | Document | 指定有关内存大小和索引选项 |
Options
可以使用的选项:
| 字段 | 类型 | 描述 | | --- | --- | --- | | capped(可选) | Boolean | 如果为true
,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true
,则需要也指定尺寸参数。 | | autoIndexID(可选) | Boolean | 如果为true
,自动创建索引_id
字段的默认值是false
。 | | size(可选) | Number | 指定最大大小字节封顶集合。如果封顶如果是 true
,那么你还需要指定这个字段。 | | max(可选) | Number | 指定封顶集合允许在文件的最大数量。 |
如果要删除掉某个集合,那么可以使用下面的命令:
javascript db.collection.drop()
插入文档
在数据库中,数据插入是最基本的操作,在MongoDB使用db.collection.insert(document)
语句来插入文档。
document是文档数据,collection是存放文档数据的集合。 例如:所有用户的信息存放在users集合中,每个用户的信息为一个user文档,插入数据:
db.users.insert(user);
*注:如果user集合不存在,那么此时会自动创建user这个集合
批量插入
insert语句不但可以插入单个文档,还可以一次性插入多个文档。 插入多个文档时,insert命令的参数为一个数组,数组元素为BSON格式的文档。 多个文档可以放在一个数组内,一次插入多条数据,例如:
db.users.insert([{name:"tommy"},{name:"xiaoming"}])
文档批量插入非常方便,但是使用批量插入时也有一些问题需要注意,因为BSON格式的限制,一次插入的数据量不能超过16M,在一个insert命令中插入多条数据时,MongoDB不保证完全成功或完全失败。
查询文档
在MongoDB中,查询指向特定的文档集合,查询设定条件,指明MongoDB需要返回的文档;查询也可以包含一个投影,指定返回的字段。
在关系型数据库中,投影指的是对列的筛选,类似的,在MongoDB中,投影指的是对出现在结果集中的对象属性的筛选。
find()方法
MongoDB中查询检索数据时使用find
命令,使用方法如下:
语法:
db.collection.find(criteria,projection);
参数说明:
criteria
– 查询条件,文档类型,可选。
projection
– 返回的字段,文档类型,可选,若需返回所有字段,则忽略此参数。
find命令两个可选参数,criteria为查询条件,projection为返回的字段,如果不传入条件数据库会返回该集合的所有文档。
修改文档
update()命令
update
命令可以更新指定文档的特定字段值,也可以替换整个文档,如果更新操作会增加文档大小,MongoDB将重新分配空间并重新定位。
语法:
db.collection.update(query,update,{upsert:boolean,multi:boolean});
参数:
query
- 查询条件,文档,和find中的查询条件写法一致。 update
- 修改内容,文档。? upsert
(可选) - 如果值为true
,那么当集合中没有匹配文档时,创建文档。默认false
。 multi
(可选) - 如果值为true
,那么将更新全部符合条件的文档,否则仅更新一个文档,默认false
。
save()命令
save
命令可以更新或插入一个新文档,与update
命令不同的是,save
只能对一个文档进行操作。
语法:
db.collection.save();
参数:
document
- 新的文档;
删除文档
需要删除文档时使用remove
命令,删除文档可以清理掉不需要的数据,释放存储空间,提升检索效率,但是错误的删除会是一场灾难,因此在执行数据删除操作时需要非常的谨慎!
语法:
db.collection.remove(
query,
justOne
);
参数:
query
- BSON类型,删除文档的条件。
justOne
- 布尔类型,true
:只删除一个文档,false
:默认值,删除所有符合条件的文档。
查询条件
相等条件
相等条件是最简单常用的的查询操作,查询条件是{ field:value }格式的BSON对象。
语法:
{ field: value }
比较条件
比较条件也是最基本的查询条件之一,通过运算符的比较运算来筛选或排除文档,从而获取到我们想要的文档数据。
语法:
{ field: { op: value } }
比较操作符op
$gt
: 大于$gte
: 大于等于$lt
: 小于$lte
: 小于等于$ne
: 不等于$in
: 包含于$nin
: 不包含于
通过MongoDB中提供的丰富运算符,可以帮助你精确的来检索数据,比如数值型的字段可以使用$gt
、$gte
、$lt
、$ne
等运算符来比较,数组条件的可以使用$in
、$nin
来实现。
数组条件
当字段包含数组,可以进行数组完全匹配或匹配特定的值。 单个元素匹配只需要传入元素的值即可,完全匹配需要传入一个数组,特定元素匹配需要"字段.索引"形式传入参数。
example:
数组完全匹配:
db.inventory.find( { tags: [ ‘fruit‘, ‘food‘, ‘citrus‘ ] } );
单个元素匹配:
db.inventory.find( { tags: ‘fruit‘ } );
特定元素匹配:
db.inventory.find( { ‘tags.0‘ : ‘fruit‘ } );
子文档条件
查询数据时,我们可能会遇到包含嵌入的子文档数据.
如果文档中包含嵌入的子文档,可以使用".key"的方式访问子文档节点,例如:
db.mycol.find({"access.level":5});
复合查询
当查询条件为多个字段时,需要使用多字段复合条件查询。
AND复合查询
example: 查询inventory集合中type字段为food并且价格低于95的所有文档。
db.inventory.find({
$and:[
{type: "food"},
{ price: { $lt: 95 }}
]
});
OR复合查询
example: inventory集合中检索数量(qty)大于100或者($or)价格(price)小于9.95的所有数据。
db.inventory.find({
$or:[
{ qty: { $gt: 100 } },
{ price: { $lt: 9.95 } }
]
});
cursor游标
find命令并不直接返回结果,而是返回一个结果集的迭代器,即游标。
想要获取数据,我们可以使用next方法来遍历游标,如下:
var myCursor = db.inventory.find( { type: "food" } );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myItem = myDocument.item;
print(tojson(myItem));
}
当我们访问一个网址后都发生了什么?(HTTP事务)
- 1.输入网址
- 2.解析域名
- 把域名解析成IP地址
- 3.建立链接(三次握手)
- 第一次:客户端发送请求给服务端
- 第二次:客服端接送信息
- 点三次:客服端确认信息
- 4.发送数据
- 5.断开链接(四次挥手)
Client 客服端
第一次握手→
第二次握手←
第三次握手→
Server 服务端
双工信道:同时具备发送和接受信道
http协议:又称为无状态协议,每一次请求对于服务器而言都是一次新的请求
请求request:get 请求头 如:req.query.username. post 请求体 如:req.body.username
nodejs针对与后台的框架express
模块化:模块化的目的是:
- 解决变量名冲突的问题
- 依赖管理问题
commonjs规范:每一个JS文件就是一个模块
- 1.通过module.exports暴露模块的借口
- 2.通过require(路径)来引入模块
Nodejs三层分离
1.表现层
2.服务层
3.持久层
用express搭建的nodejs结构:
myapp
1.bin
2.dao 持久层
model
user.js 描述mongoose接收的数据结构类型
database.js 设置mongoose
userDao.js 用require引入mongoose
3.doc 放置规范文件的文件夹
4.node_modules 放置依赖文件
5.public 放置静态文件,例如js css html
6./routes 表现层
index.js
users.js 需要用 require.("") 引入 service(服务层)中的js文件 userService.js
7.service 服务层
userServicejs 需要用 require.("") 引入 dao(持久层)中的js文件 userDao.js
8.views
9.app.js 需要用 require.("地址") 引入dao(持久层)中的js文件
10.nmp-debug.log
11.package.json