2022-08-30 14:00:04 +01:00
|
|
|
---
|
|
|
|
categories:
|
|
|
|
- Databases
|
2022-11-19 17:30:05 +00:00
|
|
|
tags: [mongo-db, node-js, mongoose]
|
2022-08-30 14:00:04 +01:00
|
|
|
---
|
|
|
|
|
|
|
|
# Creating a schema and model
|
|
|
|
|
|
|
|
## Schema
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
In order start adding
|
|
|
|
[collections and documents](/Databases/MongoDB/Introduction.md) to our database,
|
|
|
|
we use Mongoose's **schema** structure. (This is specific to Mongoose and is not
|
|
|
|
a structure that is a part of Mongo in general.)
|
2022-08-30 14:00:04 +01:00
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
We use a schema to define the shape of documents in a MongoDB collection. To do
|
|
|
|
this we instantiate an instance of the Mongoose `Schema` class and set our
|
|
|
|
properties:
|
2022-08-30 14:00:04 +01:00
|
|
|
|
|
|
|
### Creating a schema
|
|
|
|
|
|
|
|
```js
|
|
|
|
const courseSchema = new mongoose.Schema({
|
|
|
|
name: { type: String, required: true, minlength: 5, maxlength: 255 },
|
|
|
|
author: String,
|
|
|
|
tags: [String],
|
|
|
|
data: { type: Date, default: Date.now }, // if unspecified, entry will default to current date
|
|
|
|
isPublished: Boolean,
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
> This is similar to declaring a type or interface in TypeScript
|
|
|
|
|
|
|
|
#### Available data types
|
|
|
|
|
|
|
|
The following data types are available:
|
|
|
|
|
|
|
|
- `String`
|
|
|
|
- `Number`
|
|
|
|
- `Boolean`
|
|
|
|
- `Array`
|
|
|
|
- `Date`
|
|
|
|
- `Buffer`
|
|
|
|
- `ObjectID` (for UUIDs)
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
> Note that we set our validation criteria as the second property for each
|
|
|
|
> schema value. There is more info info on validation in a
|
|
|
|
> [separate entry](/Databases/MongoDB/Validating_Mongoose_schemas.md);
|
2022-08-30 14:00:04 +01:00
|
|
|
|
|
|
|
## Models
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
Once we have established our schema we can then create a **model** of it. A
|
|
|
|
model is basically a class representation of the interface we define in the
|
|
|
|
schema:
|
2022-08-30 14:00:04 +01:00
|
|
|
|
|
|
|
```js
|
|
|
|
const Course = mongoose.model("Course", courseSchema);
|
|
|
|
```
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
Now we can start adding specific courses as documents to our collection. We do
|
|
|
|
this by referring to the model, i.e.
|
2022-08-30 14:00:04 +01:00
|
|
|
|
|
|
|
```js
|
|
|
|
const course = new Course({
|
|
|
|
name: "Node.js Course",
|
|
|
|
author: "Ozzy Osbourne",
|
|
|
|
tags: ["node", "backend"],
|
|
|
|
isPublished: true,
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
2022-12-29 20:22:34 +00:00
|
|
|

|
2022-08-30 14:00:04 +01:00
|
|
|
|
|
|
|
## Outcome
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
Having created a database, connected to it with Mongoose, and created a model we
|
|
|
|
will see our collection reflected in Compass:
|
2022-08-30 14:00:04 +01:00
|
|
|
|
2022-12-29 20:22:34 +00:00
|
|
|

|