📜  使用 Mongoose 和 MongoDB Atlas 的 NodeJs CRUD 操作

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

使用 Mongoose 和 MongoDB Atlas 的 NodeJs 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。

邮递员设置:我们将使用邮递员来管理我们的请求。下载后,点击“创建请求”选项。每次我们创建一个新的 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 连接:

文件名: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;

数据库是College ,数据库中的集合是Students。

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() 的情况下使用,因为它可能会导致以后难以追踪的错误。这是因为我们无法保证结果的顺序。我们会在结果的顶部得到不同的记录,这是不可取的。为了使查询具有确定性,它们每次执行时都必须给出相同的结果。