在我们开始之前,让我们更新数据库配置以使用环境变量。
我们将在文件中定义 5 个环境变量:.env
# App Configurations PORT=3000 BASE_URL=localhost DEBUG=true APP_NAME="My App" # Database Configurations DB_HOST=localhost DB_PORT=27017 DB_NAME=root DB_USERNAME=root DB_PASSWORD=ninjaNode
现在让我们更新文件以使用这些环境变量:database.ts
// src/config/database.ts import { env } from 'dotenv'; const databaseConfigurations = { host: env('DB_HOST', 'localhost'), port: env('DB_PORT', 27017), name: env('DB_NAME'), username: env('DB_USERNAME'), password: env('DB_PASSWORD'), }; export default databaseConfigurations;
现在我们开始了。
让我们从定义什么是数据库模型开始。
数据库模型是代码中数据库表(集合)的表示形式。它是一个定义表的结构和列的数据类型的类。
它还用于对数据库集合进行操作,例如创建、读取、更新和删除记录。
模型结构将从简单结构开始到更复杂的结构。
它将以集合名称开头,因此我们需要定义一个名为的静态属性,该属性将保存集合的名称。collectionName
模型名称将是集合名称的单数形式,集合名称将始终是形式。plural
camelCase
因此,如果我们有以下集合:
users
User
usersGroups
UsersGroup
为什么我们要以单一形式命名模型?因为我们将使用模型来管理单个文档(记录/行),所以它将作为单个实体进行交互。
该模型将具有从集合中获取多个文档的操作,在内部我们将循环访问这些文档并为每个文档创建模型(实体)的新实例。
在数据库世界中有一个常用术语称为 ,它代表创建、读取、更新和删除。CRUD
这些是我们将对数据库执行的基本操作,没有它们,任何模型都不会完整。
我们还将向模型添加一些自定义操作,这些操作将特定于模型,并将用于执行一些特定任务,例如截断集合、获取文档计数等。
默认情况下,MongoDB会生成一个名为的列,该列是每个文档的唯一ID,它是一个ObjectId 12字节值,包括:_id
一个 4 字节的时间戳,表示 ObjectId 的创建,以自 Unix 纪元以来的秒为单位。
每个进程生成一次的 5 字节随机值。此随机值对于机器和过程是唯一的。
A 3-byte incrementing counter, initialized to a random value.
But we'll also create another column called that it will be an auto incremented integer, which means that the first created document will have the value and the second one will have the value , and so on.id
1
2
Later, we'll add some other cool features like defining the initial value of the model ID, and the increment stepper.
This is actually asked by many clients specially in the collection where they want to start the order number from a high number and increment it by higher numbers for each newly created order.orders
我们还将向模型添加一些关系,这些关系将用于从其他集合中获取相关文档。
有 3 种类型的关系:
这些关系在数据库世界中也称为。associations
但我们实际上要处理的是以下内容:
将一个文档嵌入(注入)到另一个文档中。
例如,当我们创建一个新帖子时,我们将在帖子中添加列,这将包含创建帖子的用户的数据,该用户文档数据将存储在 ITO 中。createdBy
这称为嵌入,这是MongoDB中非常常见的做法。
另一种方法是将多个文档注入另一个文档,例如,当我们创建一个新帖子时,我们将在帖子中添加列,这将包含数组中与帖子相关的评论数据。