📜  使用Mongoose和 MongoDB Atlas 的 Node.js CRUD 操作

📅  最后修改于: 2022-05-13 01:56:25.601000             🧑  作者: Mango

使用Mongoose和 MongoDB Atlas 的 Node.js CRUD 操作

在深入了解Mongoose的主要操作和功能之前,让我们简要了解一下它的实际含义以及它如何使我们的 Node.js 项目更加灵活和用户友好。

MongooseJs: Mongoose基本上是一个包,充当 NodeJS 应用程序和 MongoDB 服务器之间的中介。它是一个对象文档映射器(ODM),它允许我们使用映射到 MongoDB 文档的强类型模式定义对象。 Mongoose支持所有的 CRUD 操作——创建、检索、更新和删除。

先决条件:由于我们将使用 Express 来设置我们的基础服务器,我们建议您阅读一些关于 express 和官方 express 文档的文章。其他要求包括 MongoDB Atlas 和 Postman。

安装:使用以下命令通过 npm 安装mongoose和 express 模块:

npm install express mongoose --save

MongoDB Atlas 设置:

  • 设置一个帐户。
  • 建立一个新的集群。
  • 转到数据库访问并点击“添加新用户”。添加用户名和密码,如果您自动生成密码,请确保复制它,我们稍后会需要它。
  • 将您的 IP 地址列入白名单。点击“添加当前 IP 地址”并确认。
  • 转到集群,如果您的集群构建完成,然后点击连接,“连接您的应用程序”,然后复制它给您的 URL。

Postman 设置:我们将使用 Postman 来管理我们的请求。下载后,点击“创建请求”选项。每次我们创建一个新的 API 端点时,我们都会为其设置另一个请求。这将帮助您管理所有内容,因此您不必到处复制/粘贴 HTTP 请求。

服务器设置:在这里,我们将在端口 3000 上设置服务器并调用 express函数,该函数在名为 app 的变量中返回服务器对象。然后我们用端口地址启动监听器说 app.listen。最后,我们创建 /api 路由,一旦从浏览器收到请求 localhost:3000/api 就会触发该路由。

文件名:Server.js

Javascript
const express=require('express');
const bodyParser=require('body-parser');
const api = require('./api');
  
const port=3000;
const app=express();
   
app.listen(port, function() {
    console.log("Server is listening at port:" + port);
}); 
  
// Parses the text as url encoded data
app.use(bodyParser.urlencoded({extended: true})); 
  
// Parses the text as json
app.use(bodyParser.json()); 
  
app.use('/api', api);


Javascript
var mongoose=require('mongoose');
  
var StudentSchema = new mongoose.Schema({
    StudentId:Number,
    Name:String,
    Roll:Number,
    Birthday:Date,
    Address:String
});
  
module.exports = mongoose.model(
    'student', StudentSchema, 'Students');


Javascript
var mongoose = require('mongoose');
var express = require('express'); 
var router = express.Router();
var StudentModel = require('./studentschema');
  
// Connecting to database
var query = 'mongodb+srv://Username:'
    + '@student.tuufn.mongodb.net/College?'
    + 'retryWrites=true&w=majority'
  
const db = (query);
mongoose.Promise = global.Promise;
  
mongoose.connect(db, { useNewUrlParser : true, 
useUnifiedTopology: true }, function(error) {
    if (error) {
        console.log("Error!" + error);
    }
});
  
module.exports = router;


在所需端口上运行的服务器

用于检查 api 路由工作的示例输出

模式:模式是数据结构的表示。它使我们能够准确地决定我们想要什么数据,以及我们希望数据作为对象具有哪些选项。

文件名:studentschema.js

Javascript

var mongoose=require('mongoose');
  
var StudentSchema = new mongoose.Schema({
    StudentId:Number,
    Name:String,
    Roll:Number,
    Birthday:Date,
    Address:String
});
  
module.exports = mongoose.model(
    'student', StudentSchema, 'Students');

创建了一个名为“StuentSchema”的模式,它接受字段 Id、Name、Roll、Birthday、Address。

模型基本上提供了一系列预定义的方法,这些方法用于操作数据,以便从数据库集合中插入、更新、删除和检索。

使用该基本模式,我们将使用mongoose.model 方法使其可用于实际数据并将其导出,以便我们可以在 api.js 中使用。

高级路由和 MongoDB 连接:

Filename : api.js当你向 localhost:3000/api 发出请求时,express 会搜索 api 路由并执行 api.js 文件。

Javascript

var mongoose = require('mongoose');
var express = require('express'); 
var router = express.Router();
var StudentModel = require('./studentschema');
  
// Connecting to database
var query = 'mongodb+srv://Username:'
    + '@student.tuufn.mongodb.net/College?'
    + 'retryWrites=true&w=majority'
  
const db = (query);
mongoose.Promise = global.Promise;
  
mongoose.connect(db, { useNewUrlParser : true, 
useUnifiedTopology: true }, function(error) {
    if (error) {
        console.log("Error!" + error);
    }
});
  
module.exports = router;

数据库是CollegeStudents 中数据库内的集合。

Mongo 数据库一瞥

CRUD 操作

  • 创建:我们将为“/save”设置一个发布请求,我们将使用我们的模型创建一个新的学生对象,并将来自 Postman 的请求数据传递给它。

完成后,我们将使用 .save() 将其保存到数据库中。

router.get('/save', function(req, res) {
    var newStudent = new StudentModel({StudentId:101, 
        Name:"Sam", Roll:1, Birthday:2001-09-08});

    newStudent.save(function(err, data) {
        if(err) {
            console.log(error);
        }
        else {
            res.send("Data inserted");
        }
    });
});

使用 StudentModel 创建一个新的学生实例,并将引用存储在变量 newStudent 中。使用 newStudent 变量,我们将新学生的文档保存到数据库集合中。

为此,在 Postman 中,我们将发出 GET 请求 localhost:3000/api/save

注意:我们甚至可以插入新文档,而无需像上面那样对字段进行硬编码。为此,我们需要将请求从 GET 更改为 POST,并使用 body-parser 中间件来接受新学生的数据。这确保我们可以根据需要插入尽可能多的学生的详细信息。

router.post('/save', function(req, res) {
var newStudent = new StudentModel();
   newStudent.StudentId = req.body.StudentId;
   newStudent.Name = req.body.Name;
   newStudent.Roll = req.body.Roll;
   newStudent.Birthday = req.body.Birthday;
   
   newStudent.save(function(err, data){
       if(err){
           console.log(error);
       }
       else{
           res.send("Data inserted");
       }
   });
});
  • 检索:要从数据库集合中检索记录,我们使用 .find()函数。
router.get('/findall', function(req, res) {
   StudentModel.find(function(err, data) {
       if(err){
           console.log(err);
       }
       else{
           res.send(data);
       }
   });  
});

在 Postman 中,我们使用 URL localhost:3000/api/findall 发出一个新的 GET 请求,然后点击发送。它发出我们的 HTTP GET 请求并从我们的数据库集合中返回所有学生的文档。

  • 要检索单个记录或第一个匹配的文档,我们使用函数findOne()。
router.get('/findfirst', function(req, res) {
    StudentModel.findOne({StudentId:{$gt:185}}, 
    function(err, data) {
        if(err){
            console.log(err);
        }
        else{
            res.send(data);
        }
    });  
});

在 Postman 中,我们使用 URL localhost:3000/api/findfirst 发出一个新的 GET 请求并点击发送。它发出我们的 HTTP GET 请求并返回与条件StudentId:$gt:185匹配的第一个文档($gt 表示大于)。

  • 删除:要从数据库中删除记录,我们使用函数.remove()。它接受一个条件,该条件是它执行删除所依据的参数。这里的条件是Id:188。
router.get('/delete', function(req, res) {
    StudentModel.remove({StudentId:188}, 
    function(err, data) {
        if(err){
            console.log(err);
        }
        else{
            res.send(data);
        }
    });  
});
  • 我们还可以使用 .findByIdAndDelete() 方法轻松地从数据库中删除记录。使用Mongoose创建的每个对象都有自己的 _id,我们可以使用它来通过 DELETE 请求来定位特定项目。
router.post('/delete', function(req, res) {
    StudentModel.findByIdAndDelete((req.body.id), 
    function(err, data) {
        if(err){
            console.log(err);
        }
        else{
            res.send(data);
            console.log("Data Deleted!");
        }
    });  
});
  • 更新:就像删除请求一样,我们将使用 _id 来定位正确的项目。 .findByIdAndUpdate() 获取目标的 id,以及您要替换它的请求数据。
router.post('/update', function(req, res) {
    StudentModel.findByIdAndUpdate(req.body.id, 
    {Name:req.body.Name}, function(err, data) {
        if(err){
            console.log(err);
        }
        else{
            res.send(data);
            console.log("Data updated!");
        }
    });  
});

如何从数据库集合中检索最新记录:要检索最新记录,我们需要两个基本函数:

  • .sort() – 它接受一个参数,根据该参数以降序 (-1) 或升序 (1) 对数据进行排序。
  • .limit() - 它决定需要检索的文档数量。

示例:假设我想获取最近被学院录取的学生的记录。以下代码片段为我们完成了这项工作..

检索最新数据的代码片段

注意:limit() 不应该在没有 .sort() 的情况下使用,因为它可能会导致以后难以追踪的错误。这是因为我们无法保证结果的顺序。我们会在结果的顶部得到不同的记录,这是不可取的。为了使查询具有确定性,它们必须在每次执行时给出相同的结果。