NoSQL(Not Only SQL)
不仅是SQL,指的是非关系型数据库,以key-value形式存储
MongoDB
介于关系型数据库和非关系型数据库之间。是非关系型数据库中功能最丰富,最像关系型数据库的NoSql数据库,最大优点就是支持的查询语言非常强大。
install
MongoDB索引
索引是对数据表中的一列或者多列的值进行排序的一种结构,可以让查询数据库变得更快,但对新增数据和更新数据的速度会有些影响。
- 设置索引
db.user.ensureIndex({"username": 1})
- 获取当前索引的集合
db.user.getIndexes()
- 删除索引的命令
db.user.dropIndex({"username": 1})
explain executionStats 查询具体的执行时间
db.tabelname.find().explain("executionStats")
复合索引
用到关联表的查询时可以设置复合索引
如果想要用到复合索引,必须在查询条件中包含复合索引中的前n个索引列。意思就是👇
- 先设置复合索引:
db.user.ensureIndex({"username": 1, "age": -1})
- 接下来结合索引来进行查询:
-
像下面这种,添加了索引中的第一个username的话,是会用到复合索引来进行查询的
db.user.find({"username": "aaa"})
-
像下面这种,添加了索引中的 username 和 age 的话,也是会用到复合索引来进行查询的
db.user.find({"username": "aaa", "age": 18})
-
像下面这种,只添加了索引中的age的话,是
不会用到复合索引来进行查询的
db.user.find({"age": 18})
-
唯一索引
如果给表中的某个字段设置唯一索引之后,这个字段就不能重复
-
获取表中的索引
db.tablename.getIndexes()
-
设置索引
db.tablename.ensureIndex({"userId": 1}, {"unique": true})
- 删除数据
db.tablename.remove(($or: [("username": "zhangsan")], [("username": "lisi")]))
nodejs调用mongodb驱动,实现数据的CRUD
npm install mongo --save
- app.js
// 引入mongodb
const {
MongoClient
} = require('mongodb');
// 定义数据库连接的地址
const url = 'mongodb://127.0.0.1:27018';
// 定义要操作的数据库
const dbName = 'nodeTest';
// 实例化 MongoClient,传入数据库连接地址
const client = new MongoClient(url, {
useUnifiedTopology: true
});
// 连接数据库
client.connect((err) => {
if (err) {
console.log(err);
return;
}
console.log("db connect successfully 🤔");
let db = client.db(dbName);
// R
db.collection("user").find({}).toArray((err, data) => {
console.log(data);
// 操作数据库完毕之后要记得关闭数据库
client.close();
});
// C
db.collection("user").insertOne({
"name": "doris",
"age": 18
}, (err, result) => {
if (err) {
console.log(err);
return;
}
console.log("insert successfully ~");
console.log(result);
client.close();
})
// U
db.collection("user").updateOne({
"name": "doris"
}, {
$set: {
"age": 19
}
}, (err, result) => {
if (err) {
console.log(err);
return;
}
console.log("update successfully ~");
console.log(result);
client.close();
})
// D 这里以deleteOne为例,deleteMany用法相似
db.collection("user").deleteOne({
"name": "doris_1"
}, (err) => {
if (err) {
console.log(err);
return;
}
console.log("deleteOne successfully ~");
client.close();
})
})
这个是修改年龄之后的查询👇
demo
nodejs 操作mongodb数据库查询数据,通过ejs显示列表,以及通过表单增加数据。
先看数据的简单展示
这块主要修改了app.js的代码,在views下面新增了一个index.ejs,module下面的route.js代码没变,所以就不在这里列举了
- app.js
const http = require("http");
const app=require('./module/route');
const ejs = require("ejs");
const { MongoClient } = require('mongodb');
const url = 'mongodb://127.0.0.1:27018';
const dbName = 'nodeTest';
const client = new MongoClient(url, { useUnifiedTopology: true });
//注册web服务
http.createServer(app).listen(5000);
app.static("public"); //修改默认静态web目录
app.get('/',function(req,res){
client.connect((err) => {
if (err) {
console.log(err);
return;
}
let db = client.db(dbName);
db.collection("user").find({}).toArray((err, result) => {
if (err) {
console.log(err);
return;
}
console.log(result);
ejs.renderFile('./views/index.ejs', {
list: result
}, (err, data)=> {
res.send(data);
})
client.close();
});
})
})
//配置路由
app.get('/login',function(req,res){
ejs.renderFile("./views/form.ejs",{},(err,data)=>{
res.send(data)
})
})
app.post('/doLogin',function(req,res){
console.log(req.body);
res.send(req.body)
})
- index.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h2>获取用户当前列表数据</h2>
<ul>
<%for(let i = 0; i < list.length; i++){%>
<li><%=list[i].name%> --- <%=list[i].age%></li>
<%}%>
</ul>
</body>
</html>
but !! 这块只能在node app.js后正常展示,如果刷新了 localhost:5000 之后,就会报错
所以这块还需要修改,这块的修改主要指的是连接数据库的写法👇
⚠️ 因为之前mongodb的client是放在全局的,只有一个,每次请求的时候都是以前的client,所以会出现报错,现在修改的话需要将client放在具体的方法中,每次请求的时候都重新创建一个client
- app.js
const http = require("http");
const app = require('./module/route');
const ejs = require("ejs");
const { MongoClient } = require('mongodb');
const url = 'mongodb://127.0.0.1:27018';
const dbName = 'nodeTest';
// const client = new MongoClient(url, { useUnifiedTopology: true });
//注册web服务
http.createServer(app).listen(5000);
app.static("public"); //修改默认静态web目录
app.get('/', function (req, res) {
// 主要看这里的代码
MongoClient.connect(url, { useUnifiedTopology: true }, (err, client) => {
if (err) {
console.log(err);
return;
}
let db = client.db(dbName);
db.collection("user").find({}).toArray((err, result) => {
if (err) {
console.log(err);
return;
}
console.log(result);
client.close();
ejs.renderFile('./views/index.ejs', {
list: result
}, (err, data) => {
res.send(data);
})
});
})
})
//配置路由
app.get('/login', function (req, res) {
ejs.renderFile("./views/form.ejs", {}, (err, data) => {
res.send(data)
})
})
app.post('/doLogin', function (req, res) {
console.log(req.body);
res.send(req.body)
})
经过修改后,在localhost:5000页面可以看到数据,并且刷新之后也不会报错
通过页面表单新增数据到数据库
- app.js
const http = require("http");
const app = require('./module/route');
const ejs = require("ejs");
const {
MongoClient
} = require('mongodb');
const url = 'mongodb://127.0.0.1:27018';
const dbName = 'nodeTest';
const querystring = require('querystring')
// const client = new MongoClient(url, { useUnifiedTopology: true });
//注册web服务
http.createServer(app).listen(5000);
app.static("public"); //修改默认静态web目录
app.get('/', function (req, res) {
MongoClient.connect(url, {
useUnifiedTopology: true
}, (err, client) => {
if (err) {
console.log(err);
return;
}
let db = client.db(dbName);
db.collection("user").find({}).toArray((err, result) => {
if (err) {
console.log(err);
return;
}
console.log(result);
client.close();
ejs.renderFile('./views/index.ejs', {
list: result
}, (err, data) => {
res.send(data);
})
});
})
})
//配置路由
app.get('/register', function (req, res) {
ejs.renderFile("./views/register.ejs", {}, (err, data) => {
res.send(data)
})
})
app.post('/doRegister', function (req, res) {
let body = querystring.parse(req.body)
MongoClient.connect(url, {
useUnifiedTopology: true
}, (err, client) => {
if (err) {
console.log(err);
return;
}
let db = client.db(dbName);
db.collection("user").insertOne({
"name": body.name,
"age": body.age
}, (err, result) => {
if (err) {
console.log(err);
return;
}
console.log("insert successfully ~");
res.send("insert successfully ~")
// client.close();
})
})
})
- register.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./css/style.css">
</head>
<body>
<form action="/doRegister" method="post">
<h2>注册页面</h2>
用户名:<input type="text" name="name" />
密 码:<input type="text" name="age" />
<input type="submit" value="提交">
</form>
</body>
</html>