node.js 总结

node.js总结

模块的引入
const module = require("模块名称")
fs模块
  • 文件的异步读取
//fs.readFile('地址',回调函数)

 fs.readFile("./html/index.html","utf-8",(err,data)=>{
   console.log("err",err)    //如果文件读取成功,err就是null
    console.log("data",data)  //data就是读取后的文件内容
 })
 
  • 文件同步读取
//fs.readFileSync 

let data = fs.readFileSync("./html/index.html")
console.log("data",data)  
console.log("我要成功了!")
  • try - catch - finally
try{
    let data = fs.readFileSync("./html/indexa.html")
    console.log("data",data)  
}catch(e){  //e代表事件对象
    //处理错误 
    console.log("e",e)
}
console.log("我要成功了")
  • 给文件改名
fs.rename('改前','改后',err=>{})
fs.renameSync("改前","改后")
fs.renameSync("./html/index.html","./html/about.html")
  • 删除文件
fs.unlickSync("文件路径")
  • 删除目录
 fs.rmdir("./html",err=>{
    console.log("html目录以及被删除了哦....")    
 })
http模块
const = require("http")
const http = http.createServer((req,res)=>{
	//req 相当于请求报文 
	//res 相当于响应报文
	//后端需要设置响应头 后端设置的权重高
	res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})
	res.write("hello world")
	res.end() //后端需要结束响应 必须写
	
})

app.listen(8000,()=>{
	console.log("server in running...")
})
url模块
//let obj = url.parse(str) 返回值是个对象 数据如下

protocol: 'http:',	协议
slashes: true,	双斜杠
auth: null,   作者
host: 'localhost:8002',  主机
port: '8002',	端口
hostname: 'localhost',  baidu
hash: '#title',	哈希(锚)	search: '?username=sdfsdf&content=234234',	查询字符串
query: 'username=sdfsdf&content=234234',	数据
pathname: '/aaa',	文件路径
path: '/aaa?username=sdfsdf&content=234234',	文件路径
href: 'http://localhost:8002/aaa?username=sdfsdf&content=234234#title'
  • 第一种用法
let str = "http://www.baidu.com:80/app/html/index.html?a=1&b=2#title" 
let obj = url.parse(str)
let josn = {}
let query = obj.query
let queryArr = query.split
query.forEach(v =>{
	let vArr = v.split("=")
	json[vArr[0]] = vArr[1]
})
console.log(json)
  • 第二种用法
let str = "http://www.baidu.com:80/app/html/index.html?a=1&b=2#title" 
let obj = url.parse(str,true) //可以直接将字符串转换为对象 
url.format(obj) //可以将对象转换为url字符串
querystring模块
let querystring = require("querystring")

//处理查询字符串,地址栏的形式传参    
let str = "a=1&b=2&c=3"
querystring.parse(str) //直接将字符串转换为对象
资源托管 处理接口
//引入响应的原生模块
const http = require("http")
const fs = require("fs")
const url = require("url")
const querystring = require("querystring")

//实例化http对象 
const app = http.createServer((req, res) => {
    //排除 /favicon.ico的请求
    if (req.url.indexOf("/favicon.ico") === -1) {
        //判断读取的是动态资源 还是静态资源 
        if (req.url.indexOf("/api") !== -1) {//处理接口
            //处理地址栏的数据
            let urlObj = url.parse(req.url, true)
            console.log(urlObj.query)


            //处理非地址栏的数据
            let noAddressDate = ""
            req.on("data", chunk => {
                noAddressDate += chunk
                //chunk代表抓取的一片数据 data事件内部会频繁触发
            })
            req.on("end", () => {
                      console.log(querystring.prase(noAddressDate))
            })

        } else {//处理静态资源
            try {
   let path = req.url === "/" ? "/index.html" : req.url
   let html = fs.readFileSync("./www" + path)
   res.write(html)
            } catch (error) {
   let html = fs.readFileSync("./www/nopage.html")
     res.write(html)
            }
        }
    }
    res.end()
})
//监听端口
app.listen(3000)
模块化 commonJS

commnJs 是一个我规范 主要为了js在后端的表现而制定

注意 :commonJS是nodejs默认模块管理方式 不支持es6的模块化管理方式 但是支持所有es6+语法

node.js 的模块主要分为三种 :
内置模块 node本身自带的模块
第三方模块 别人封装好的模块 需要用 (npm install -g 模块名)下载到项目中
自定义模块 自己封装的模块

  • 自定义模块

exports.自定义属性 = 值
批量输出 都是属性 可输出多次

// a.js 文件内容
let aa = 100;
let bb = 200;
exports.aa = aa;
exports.bb = bb;

//b.js文件内容 
let b = require("./a.js");
console.log(b) //结果如下
{ aa: 100, bb: 200 }

module.exports = 值
只输出一次

//a.js文件内容
let a = 10
let b = "bmw"
let fn = ()=>{
    console.log("函数")
}
class Person{
    constructor(){
        console.log("这是Person的构造函数")
    }
    show(){
        console.log("这是show方法...")
    }
}

module.exports = {
    a,b,fn,Person2:Person
}

//b.js文件内容
let a1 = require("./mod/b")
console.log(a1)//结果如下
{ a: 10, b: 'bmw', fn: [Function: fn], Person2: [Function: Person] }
npm

npm 包管理工具 node下载自带
作用 :安装及管理包

  • 安装到全局环境
安装   npm i 包名 -g 
写在  npm uninstall -g 
g : global 全局的意思
  • 安装到项目环境
  • 初始化项目环境
方法1
npm init  
需要 自己配置一些参数 
方法2 
npm init -y 
参数自动生成  但是目录名必须是英文 

初始化完成会生成两个文件
package.json 管理包的文件
package-lock.json 文件用来固化依赖

{
  "name": "npm",	//项目名称
  "version": "0.0.1",	//版本
  "description": "test and play",	//描述
  "main": "index.js", //入口文件
  "dependencies": {  //项目依赖  上线也要用
    "jquery": "^3.2.1"
  },
  "devDependencies": { //开发依赖 上线就不用
    "animate.css": "^3.5.2"
  },
  "scripts": {	//命令行
    "test": "命令行",
  },
  "repository": {	//仓库信息
    "type": "git",
    "url": "git+https://github.com/alexwa9.github.io/2017-8-28.git"
  },
  "keywords": [  //关键词
    "test",'xx','oo'
  ],
  "author": "wan9",
  "license": "ISC",	//认证
  "bugs": {
    "url": "https://github.com/alexwa9.github.io/2017-8-28/issues"//问题提交
  },
  "homepage": "https://github.com/alexwa9.github.io/2017-8-28#readme"//首页
}
  • 下载项目依赖包
    只能在当前项目使用 上线了也需要依赖 --save
//安装
npm i 包名 --save 
npm install 包名 -S 
npm install 包名@x.x.x -S

//卸载
npm uninstall 包名  --save
npm uninstall 包名  -S
  • 下载开发依赖包

在写项目的时候使用 项目上线就不需要了 --save-dev

npm install 包名 --save-dev
npm install 包名 -D
  • 查看包
npm list 列出所有已安装包 
npm outdated 版本对比(安装过的包)
npm info 包名  查看当前包的概要信息 
npm view 包名 versions 查看包历史版本列表
  • 安装所有依赖包
npm install   //安装package.json里面指定的所有包  
  • 版本约束
^x.x.x   约束主版本,后续找最新
~x.x.x   保持前两位不变,后续找最新
*		 装最新
x.x.x 	 定死了一个版本
选择源

安装选择镜像源的工具包 npm install nrm -g
查看所有源 nrm ls
测试所有源 nrm test
切换源 nrm use 源名

  • 安装卡顿的解决方法
ctrl + c -> npm uninstall 包名  ->  npm cache verify 清除缓存 -> 换4g网络 -> npm install 包名 
发布包
  • 在npm官网注册一个账户

  • 登录

    在命令行输入 npm login 登录
    然后一次输入 user/password/email

  • 创建包

    npm init -y

    创建入口文件 index.js

    编写输出
    举例如下 :

//sum.js文件
const sum = (a,b) => {
    return a + b
}

module.exports = sum;

//index.js 文件
const sum = require("./sum")
module.exports = {
    sum
}

//package.json文件
{
  "name": "gengwentuo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "nodemon index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}


  • 发布

npm publish
注意:要检查package.json文件name的值 在npm官网是否存在

  • 迭代

意思就是 你上传的包修改后
在发布时 要把package.json文件里面的版本号更改一下

  • 删除

npm unpublish

包的发布 迭代 删除 需要在包目录下进行
删除包 有时需要发送邮件

bower
  • 全局安装bower

bower i 包名 -g (安装)
bower uninstall 包名 -g (卸载)

  • 初始化项目环境

bower init
生成 bower.json 第三方包管理配置文件

  • 下载项目依赖

//安装
bower install 包名#x.x.x -S (指定版本使用#)
//卸载
bower uninstall 包名

  • 下载开发依赖

bower install 包名 -D

yarn
  • 建议去官网下载 yarn

  • 初始化项目

yarn init

  • 下载包
yarn add 包名
yarn add 包名@x.x.x -S //下载项目依赖包
yarn add 包名@x.x.x -D  // 下载开发依赖包
  • 删除包

yarn remove 包名

  • 安装项目的全部包
yarn  或者  yarn install 
  • 使用yarn安装全局
yarn gloabal add 包名
yarn gloabal remove 包名
express
  • 二次封装 非侵入式 增强型

  • 搭建web服务器

let express = require("express")
let server = require()
server.listen(端口,地址,回调)
  • 静态资源托管

server.use(express.static("./www"))

  • 接口响应
server.get(url,(req,res,next)=>{})
server.post(url,(req,res,next)=>{})
  • req 请求体
req.query //获取地址栏数据 
req.body //获取非地址栏数据 
req.params //如果是动态接口时 监听动态的那个目录名
req.method //获取前端的提交方式
  • res 响应体
res.send() //返回给前端任意格式的数据 
res.json() //只能返回给前端json格式的数据 
res.status(404).send({error:1}) //当请求出错时返回给前端信息
res.sendFile(path.resolve("pubilc/error.html"))//渲染纯HTML文件 依赖path第三方模块 

​ 测试代码如下:

const express = require("express")

//引入中间件  body-parser (作用:增加一些功能)
const bodyParser = require("body-parser")

const path = require("path")

//创建服务器 
const app = express();

//监听端口 

app.listen(3000,"localhost",()=>{
    console.log("3000正在监听")
})

//通过app.use()  使用body-parser中间件 (作用:增加一些功能)
app.use(bodyParser())

app.get("/api/goods",(req,res)=>{
    // console.log(req.body) //依赖中间件body-parser  获取非地址栏的数据
    // console.log(req.query) //req.query 接收前端传递过来的数据 获取的是地址栏的数据
    // res.send("hello world")  //返回给前端数据 任意格式
    // res.json({a:1,b:2}) //只能返回给前端json格式的数据
    //res.status(404).send({error:1}) //请求出错 返回给前端信息 
    // res.sendFile(path.resolve('public/index.html'))//渲染纯 HTML 文件
})



//监听动态接口 :id 表示动态的目录名 
// app.get("/api/goods/:id",req=>{
//     console.log("详情...",req.params.id) //用         req.params.id 可以获取动态的接口名 
//     console.log(req.method) //req.method 可以本次请求的方式 
// })
  • jsonp 响应
server.set('jsonp callback name','cb')  //设置函数名 默认时callback
server.get('/jsonp接口',(req,res) => res.jsonp)

代码如下

app.get("/api/home",(req,res)=>{
    console.log("jsonp来的数据",req.query) //获取前端传递来的参数
    res.jsonp({err:0,data:{a:1,b:2}}) //返回一个结果,调用客户端传递来的callback=jsonp_XXXXX方法调用执行,传递参数给他
})

//具体响应流程
前端发送请求(ajax jsonp) -> 后端接收请求(根据前端传递来的数据 向数据库获取数据 然后用res.jsonp返回给前端数据 -> 前端接收数据)  
  • 处理一部分接口

共有业务逻辑 在一起给处理了
server.all(“admin/*”,(req,res,next)=>{})
all 不管时get 还是post 都可以响应
若下面还有接口响应 需要next 延续

next() 管道函数

代码如下

app.get("/api/*",(req,res,next)=>{
    console.log("a,b的所有的公共的业务逻辑...")
    next()  //使得后续得以运行
})

app.get("/api/a/*",(req,res,next)=>{
    console.log("/api/a的数据请求....")
    next()
})
app.get("/api/a/aa",(req,res)=>{
    console.log("/api/a/aa的数据请求....")
})
  • use
默认use不写地址就是截获了根路径   app.use("/",callback)
app.use((req,res,next)=>{
    console.log("进入app.use了哦...")
    next() //向下延续
})

app.use("/api/*",(req,res,next)=>{  //类似 all   
    console.log("进入app.use了哦...")
    next() //向下延续
})
  • next 管道函数
app.use((req,res,next)=>{
    req.query = "abcdefg"
    next()
})

app.get("/api/home",(req,res,next)=>{
   //可以获取上面设置的req.query 
    console.log("进入了/api/home....",req.query)
})
  • 中间件 (如body-parser)

中间件 需要依赖use来使用
app.use(bodyParser())

**举例 **

npm i body-parser -S //安装包
let bodyParser=require('body-parser')//引入中间件
server.use(bodyParser())//安装中间件
  • 后端跳转

res.redirect(url)

let abc;
app.get("/api/old",(req,res,next)=>{
   //res.redirect(地址)
   abc = req.query
   res.redirect("http://localhost:3000/api/new") //后端跳转
})

app.get("/api/new",(req,res,next)=>{
    console.log("进来了哦.....",abc)
    res.end()
}) */
  • 封装body-parser中间件
//bdparser.js  文件 (封装)
const querystring = require("querystring");

module.exports = {
    urlencoded:(options) => {
        options = options || {}
        options.limit = options.limit || 102400
        return (req,res,next) => {
            let str = " "
            req.on("data",chunk => str+=chunk)
            req.on("end",()=>{
                if(str.length>options.limit){
                    throw new Error()
                }else{
                req.body = querystring.parse(str)
                    next()
                }

            })
        }
    }
}



//body-parser.js文件  (引用上面的封装)

const express = require("express");

const bodyParser = require("./middleware/bdParser.js")

const app = express();

app.listen(3000)

// app.use(bodyParser())
app.use(bodyParser.urlencoded({
    limit:102400  //设置获取前端数据的长度
}))

app.post("/api/old",(req,res,next) => {
    console.log(req.body)
    res.end()
})



cookie-session
  • 思想

1、客户端用户名跟密码请求登录
2、服务端收到请求,去库验证用户名与密码
3、验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session
4、客户端收到 响应 以后可以把收到的字符存到cookie
5、客户端每次向服务端请求资源的cookie会自动携带
6、服务端收到请求,然后去验证cookie和session,如果验证成功,就向客户端返回请求的库数据

  • 安装引入cookie-session
let cookieSession = require("cookie-session")
  • 配置中间件
app.use(cookieSession({
	name:"保存到服务器的session的名字",
	keys:[必选参数,代表加密层级],
	maxAge:1000 //保留cookie的时间
}))
  • 设置客户端cookie 及 备份服务端session
req.session.key = value
  • 读cookie对比session
req.session.key  返回true

具体操作代码如下

const express = require("express")

const cookieSession = require("cookie-session")

const app = express();

//静态资源托管
app.use(express.static("./public"))


app.listen(3000,()=>{
    console.log("正在监听3000端口")
})


//配置中间件
app.use(cookieSession({
    name:"myCookie",
    keys:['aa','bb','cc'],
    // maxAge:1000*300
}))


//验用户身份 
app.get("/api/login",(req,res)=>{
    //1.验证客户端传递来的用户名和密码和数据库中密码是否一致 
    //2.给客户端设置cookie 并且同时r服务端备份session
    req.session.username ="geng"
    //后端设置完cookie后 就可以返回给前端数据了 
    res.send({
        err:0,
        msg:"登录成功"
    })
})

//验证用户身份 
app.get("/api/user",(req,res)=>{
    const pass = req.session.username; //返回布尔值 若为true说明用户在登录状态
    if(pass){
        res.send({
            err:0,
            data:"ok"
        })
    }else{
        res.send({
            err:1,
            data:"用户未登录"
        })
    }
    res.end()
})

//注销登录 
app.get("/api/logout",(req,res)=>{
    //删除服务端session 和客户端的cookie
    req.session.username = undefined
    res.end()
})
token

思想

在服务端不需要存储用户的登录记录,全部发给客户端有客户端自己存(cookie,local)

1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

具体实现代码如下

let express = require("express")
let app = express()
let bodyParser = require("body-parser")

//引入jsonwebtoken模块
let jwt = require("jsonwebtoken")

app.listen(3000,()=>console.log("3000端口正在监听中..."))

app.use(bodyParser())

//请求登录,服务端生成token令牌
app.get("/api/login",(req,res)=>{
    //1.获取username,password 进行数据库的验证
    //2.生成token令牌
    let token = jwt.sign({
        username:req.query.username
    },"nz1906",{
        expiresIn:60 //过期时间,按照秒算
    })
    // console.log(token)
    //3. 将token和库信息返回给前端
    res.send({
        err:0,
        msg:"用户登录成功了..",
        data:"库数据",
        token
    })
})

//校验token
app.get("/api/user",(req,res)=>{
    //1.获取客户端传递来的token
    let token = req.query.token || req.body.token || req.headers.token;
    //2.校验token 
    jwt.verify(token,"nz1906",(err,decode)=>{
        // console.log("err",err) //null就代表没有报错
        console.log("decode",decode) 
        if(err){ //一旦报错了,说明用户信息校验失败
            res.send({ 
                err:1,
                msg:"当前登录失败,token失效了!"
            })
        }else{ //校验成功
            //3.数据返回给前端
            res.send({
                err:0,
                msg:"成功!",
                data:"库数据"
            })
        }
    })
})

token的删除是由客户端 负责删除

文件上传
  • path内置模块

API

  • 磁盘路径解析
path.parse("c:\\wamp\\xx.png") string -> object
返回结果如下:
{
root:"c:\\",盘符
dir:"c:\\wamp", 目录
base:"xx.png", 文件名
ext:".png",  扩展名
name:"xx" 文件。不含扩展名
}
  • 片段合并(join)
path.join('磁盘路径1',"磁盘路径2","磁盘路径3")

__dirname 魔术变量 返回当前文件所在的磁盘路径
  • 片段合并resolve
path.resolve("磁盘路径1","磁盘路径n")

合并磁盘片段,从右到左找到根目录,从左到右拼接,若没有找到根目录,就以当前文件所在目录为根目录
  • multer中间件

multer接受form-data编码数据 所有要求前端携带时注意一下 如:

let multer = require("multer")

let objMulter = multer({dest:'./upload'})//指定保存到服务端的位置
//安装中间件
app.use(objMulter.any())//允许上传什么类型文件 any代表任何类型
//中间件扩展了req请求体req.files
app.get("/api/reg",(req,res)=>{
	req.files ///返回一个对象 数据如下
})

fieldname: 表单name名
originalname: 上传的文件名
encoding: 编码方式
mimetype: 文件类型
buffer: 文件本身
size:尺寸
destination: 保存路径
filename: 保存后的文件名 不含后缀
path: 保存磁盘路径+保存后的文件名 不含后缀

具体代码操作如下

const express = require("express")

const fs = require("fs")

const path = require("path")

const multer = require("multer")

const app = express()

app.listen(3000,()=>{
    console.log("正在监听3000端口")
})
//静态资源托管 客户端可以通过地址直接访问文件
app.use(express.static("./public"))

//实例化 nulter
 let objMulter = multer({
     dest:'./public/upload'
 })

//使用中间件 来增添req.files的功能 

//  app.use(objMulter.image())//表示只能上传 图片
 app.use(objMulter.any()) //表示能上传任意类型的文件

 app.get("/api/reg",(req,res) => {
     console.log(req.files)
     console.log(req.files[0].path)//图片上传后在服务端的位置 及名字 
    //上传到服务端的文件没有后缀名 不能正常使用 
    //通过下面操作给文件添加后缀名
     let  oldFile = req.files[0].path 
     //利用path获取文件的后缀名 然后进行拼接 
     let newFile = req.files[0].path + path.parse(req.files[0].originalname).ext
     fs.renameSync(oldFile,newFile) //更改文件名字
     res.send({ //图片地址返回给客户端
         err:0,
         url:"http://localhost:3000/upload/"+req.files[0].filename + path.parse(req.files[0].originalname).ext
     })

 })
后端渲染

通常前端根据后端返回的json数据,然后来生成html被称为前端渲染 而后端渲染是把后端json和html结合渲染好后返回到浏览器 没前端什么事情

下面介绍两种后端渲染页面的方法

  • jade

1.要新建一个jade文件 在里面编写 html
2.新建一个js文件 在文件中引入jade第三方模块
3.再用jade.renderFile(“jad的文件地址”) 引入jade文件
4.然后返回给浏览器
具体操作代码如下 e

//index.jade  (在views/jade文件夹下)
html
    head
    body
        div
            ul
                li
                    a(href="http://baidu.com")百度
        div 
            h1 #{data}
//jade.js  (与vives文件夹同级)
const express = require("express")

const jade = require("jade")

const app = express() 

app.listen(3000,()=>{
    console.log("3000端口正在监听")
})

app.get("/",(req,res)=>{
    // jade.renderFileFile("jade文件地址",[数据])
    let html = jade.renderFile("./views/jade/index.jade",{
        pretty:true,data:"你好"
    })
    res.send(html)
})
  • ejs
const ejs = require("ejs")
ejs.renderFile("ejs模板文件",{数据},(err,data)=>{})
//err 错误 返回null 代表没有错误 
//data 渲染后的字符\流
//ejs模板 表示后缀名为ejs的html文件 
  • ejs模板文件语法

ejs 结构就是html
输出: <%= 数据名|属性名|变量名 + 表达式 %>
语句: <% 语句 %> 需要被<% %> 包裹
非转义输出: <%- 数据名|变量名 + 表达式 %>
载入公共:<%- include(’./hd.ejs’,{数据}) %>

路由

由于在一个文件中写多个接口比较繁琐 由此诞生了路由
对于后端来说 路由可以理解为是一个子服务器
一个路由就是一个小的服务器(server/app) 处理一个接口

  • 路由的配置及使用
//index.js 文件 (与router同级)
const express = require("ex文件夹press")

const app = express()

app.listen(3000,()=>{
    console.log("3000端口正在监听")
})
//安装路由
app.use("/api/user",require("./router/a"))

//创建路由 
//a.js文件 (在router文件夹下)

const express = require("express")
//创建路由
const router =  express.Router()

//http://localhost:300/api/user 
//通过这个地址就可以响应这个接口
router.get("/",(req,res)=>{
    console.log("你好")
    res.end()
})

//在子路由里安装路由
router.use("/b",require("./b.js"))

//导出路由
module.exports = router

//文件b.js (在router文件夹下 与a.js同级)

const express = require("express")

const router =  express.Router()

router.get("/",(req,res,next)=>{
    console.log("这是b.js文件里面的/api/a/b哦....")
    res.end()
})
//导出路由
module.exports = router

router.all("*",当前路由下的验证工作)
//截获当前路由下的部分公共业务 (需要next延续)

mysql

node.js操作mysql数据库

//1引入mysql客户端的包
var mysql = require("mysql")
var express = require("express")
var app = express()
app.listen(3000)

//2创建库的链接
var connection = mysql.createConnection({
    host     : 'localhost',  //mysql的服务器地址
    user     : 'root',     //用户名
    password : 'root', //密码
    database : '2020-03-13'  //数据库名
});

//3链接
connection.connect()

//4查询
let str4 = `SELECT * FROM user`

//表相关的操作
// connection.query('sql语句', function (error, results, fields) {})

//前端请求将数据返回给前端
 app.get("/api/user",(req,res,next)=>{
    connection.query(str4, function (error, results, fields) {
         // console.log("error",error)
         // console.log("results",results)//返回一个对象
         // console.log("fields",fields)

        res.send({err:0,data:results})
        //5关闭库
       connection.end();
     })
 })

mongodb

mongodb非关系型数据库 又叫nosql 缓存型 使用场景多是解决大规模数据集合多重数据种类

下载 安装(必须安装在英文目录下)

为了从命令提示符下运行MongoDB服务器,你必须从MongoDB目录的bin目录中执行mongod.exe文件。
或者将bin配置到环境变量path中。
mongod --dbpath F:\MongoDB\data\db

1.配置数据文件存储位置:
找到安装目录\Server\4.0\bin\ -> cmd回车-> mongod 回车->mongod --dbpath c:\data\db
data和db目录需要手动创建

2.服务器启动
找到安装目录 \server\4.0\bin\ ->cmd回车->mongo回车

3.客户端启动
找到安装目录 \server\4.0\bin\ -cmd 回车-> mongo回车

4.环境变量
把安装目录添加到环境变量

  • 库的操作

查所有库:show dbs
查看当前数据库 : db
创建库:use 库名 (没有此库就是新建库 有就切换)

删除库 db.dropDatabase() 删除当前库

  • 集合的操作

创建集合: db.createCollection(“集合名”,{配置})
配置:{size:文件大小,capped:true,max:条数|文档数 }capped定量
db.表(集合).isCapped() 返回true/false 是否是定量

查询集合: show collections 或者 db.getCollectionNames()

删除集合: db.集合名.drop()

对集合的增删改查

db.集合.save({}) //添加一条
db.集合.insert({}) //添加一条
db.insertOne({}) //添加一条
db.集合.save([{ },{ }]) //添加多条
db.集合.insert([{},{}]) //添加多条

注意:insert 不会替换相同ID save会

db.集合.deleteOne({要删除数据条件描述}) //删除一条
db.集合.remove({},true) //删除一条
db.集合.remove({要删除数据条件描述})//删除多条
db.集合.remove({}) //清空集合

db.集合.udpate({查询条件},{替换条件},插入boolean,全替换boolean)

查询条件:
{age:22} age == 22
{age:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:22}̲} age > 22 {a…lt:22}} age < 22
{age:{KaTeX parse error: Expected 'EOF', got '}' at position 7: gte:22}̲} age>=22 {ag…lte:22}} age<=22
{age:{ l t e : 122 , lte:122, lte:122,gte:22}} age<=122 && age>=22
{$or:[{age:22},{age:122}]} 22 or 122
{key:value,key2,value2} value && value2
{name:/正则/}

所有:db.集合.find(条件)
条数: db.集合.find().count()
去重:db.集合.distinct(key)

db.集合.find({条件},{指定要显示列区域})

指定要显示列区域
username:1 显示这个区域,其他不显示
username:0 不显示这个区域,其他显示
_id 是默认显示

db.集合.find().sort({key:1,key2:-1}) //升
db.集合.find().sort({key:-1}) //降

  • 限定

db.集合.find().limit(number) //限定
db.集合.find().skip(number) //跳过
db.集合.findOne()//找第一个
db.集合.find().limit(1) //查询第一条

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值