使用 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;
模式:模式是数据结构的表示。它允许我们确切地决定我们想要什么数据,以及我们希望数据作为对象具有哪些选项。
文件名: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。
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() 的情况下使用,因为它可能会导致以后难以追踪的错误。这是因为我们无法保证结果的顺序。我们会在结果的顶部得到不同的记录,这是不可取的。为了使查询具有确定性,它们每次执行时都必须给出相同的结果。