nodejs-5

本文详细介绍了MongoDB的NoSQL特性,包括安装、索引创建、删除及查询优化。同时,展示了如何在Node.js环境中进行数据的CRUD操作,包括连接数据库、设置索引、插入、更新和删除数据。还提到了使用EJS模板引擎显示查询结果,以及通过表单提交数据到数据库的实现方法。最后,针对Node.js应用中连接数据库的错误进行了修正,确保了数据持久化的稳定性和正确性。
摘要由CSDN通过智能技术生成

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值