引入MongoDB和Mongoose
我们将使用MongoDB作为应用程序的后端数据库。您当然可以使用其他解决方案来持续您的应用程序数据,例如在文件中,在关系SQL数据库中或其他类型的存储机制中。在本章中,我们将介绍流行的数据库存储的MongoDB。
mongoDB是一个NOSQL数据库。在我们谈论什么是NOSQL数据库之前,让第一个关于关系数据库的高个子,以便我们可以提供有意义的对比度。如果您以前从未听说过关系数据库,则可以想到关系数据库,例如电子表格结构的数据库,每个条目通常是表中的一行。关系数据库通常由SQL或结构化查询语言控制。流行关系数据库的示例是MySQL,SQL Server和PostgreSQL。
NOSQL数据库通常称为非关系数据库,其中NoSQL的意思是SQL的任何内容(请参阅如何渗透SQL的普及?)。似乎NOSQL是对SQL的抗议活动,但实际上是指不像电子表格那样结构的数据库,即比SQL数据库较不刚性。
那么,为什么要使用Mongo?首先,它很受欢迎,这意味着在线上有很多帮助,其次,自2007年以来就成熟了,并被eBay,Craigslist和Orange等公司使用。
Mongodb的建筑
如前所述,MongoDB的体系结构是一个NOSQL数据库,它以集合和文档的形式存储信息。 MongoDB存储一个或多个收藏。一个集合代表我们应用程序中的一个实体,例如在电子商务应用中,我们需要类别,用户,产品等实体。这些实体中的每个实体将是我们数据库中的一个集合。
然后,一个集合包含文档。文档是包含代表文档的各种相关字段的实体的实例。例如,产品文档将包含名称,图像和价格字段。每个字段都是键值对。文档看起来很像具有各种属性的JSON对象(尽管它们在技术上是二进制JSON或BSON)。收集文档树的示例如下:
Database
→ Products collection
→ Product document {
price: 26,
title: "Learning Node",
description: "Top Notch Development book", expiry date: 27-3-2020
}
→ Product document
...
→ Users collection
→ User document {
username: "123xyz", contact:
{
phone: "123-456-7890", email: "xyz@example.com"
} }
→ User document ...
机器准备
为了连接到我们的数据库,我们需要在计算机中运行一个。因此,在此处按照说明:Install MongoDB Community Edition — MongoDB Manual
用于可视化
我在我的 mac 上使用Table Plus,但是这是一个很好的多平台 gui 可视化您的蒙哥数据库:Compass
猫鼬
Mongoose提供了一种直接的,基于模式的解决方案,可以对您的应用程序数据进行建模。它包括内置类型的铸造,验证,查询建筑物,业务逻辑挂钩等。
npm install mongoose
然后导入 mongoose
const mongoose = require("mongoose")
不要忘记启用JSON
解析,这使您可以访问req
:
在您的代码编辑器中:
app.use(express.json())
bodyparser 将让 express 解析请求的JSON
主体。
连接到我们的数据库
在您的代码编辑器中:
mongoose.connect("mongodb://localhost:27017/test")
Mongoose模型
让我们创建一个模型
- 叫:小猫
- 具有这些属性:
- 名称
const Kitten = mongoose.model("Kitten", { name: String })
仅出于测试的目的,让我们立即创建一个新的小猫称为 le Chat
const kittenToSave = new Kitten({ name: "Le chat" })
kittenToSave.save().then((kitten) => res.json(kitten))
整个文件应该看起来像这样
const express = require("express")
const bodyParser = require("body-parser")
const mongoose = require("mongoose")
const app = express()
app.use(bodyParser.json())
mongoose.connect("mongodb://localhost:27017/test")
const Kitten = mongoose.model("Kitten", { name: String })
kittenToSave.save().then((kitten) => res.json(kitten))
// TO BE COMPLETED...
app.listen(3000)
文件完成
const express = require("express")
const bodyParser = require("body-parser")
const mongoose = require("mongoose")
const app = express()
app.use(bodyParser.json())
mongoose.connect("mongodb://localhost:27017/test")
const Kitten = mongoose.model("Kitten", { name: String })
// Create
app.post("/kittens", (req, res) => {
const kittenToSave = new Kitten(req.body)
kittenToSave.save().then((kitten) => res.json(kitten))
})
// Read All
app.get("/kittens", async (req, res) => {
Kitten.find()
.then((kittens) => res.json(kittens))
.catch(() => res.status(404).end())
})
// Read one by ID
app.get("/kittens/:id", async (req, res) => {
Kitten.findById(req.params.id)
.then((kitten) => res.json(kitten))
.catch(() => res.status(404).end())
})
// Update one by ID
app.put("/kittens/:id", async (req, res) => {
Kitten.findByIdAndUpdate(req.params.id, req.body)
.then((kitten) => res.json(kitten))
.catch(() => res.status(404).end())
})
// Delete one by ID
app.delete("/kittens/:id", async (req, res) => {
Kitten.findOneAndDelete(req.params.id)
.then((kitten) => res.json(kitten))
.catch(() => res.status(404).end())
})
app.get("*", (req, res) => {
res.status(404).end()
})
app.listen(3000)