首页 > 代码库 > 初入javascript知识点(八)

初入javascript知识点(八)

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中以BSONBinary-JSON)文档的格式存储在磁盘上。 BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON,BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如DateBinData类型。 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

初入javascript知识点(八)