Node.js使用Mongoose操作MongoDB
Tags: webdev, javascript, tutorial, react
Published: 2023-09-08 15:43:58

如果想通过专栏的形式查看本次项目实践可以点击查阅[Next图册目实践](http://rexweb.link/categories/Next%E5%9B%BE%E5%86%8C%E7%9B%AE%E5%AE%9E%E8%B7%B5/)

[我的B站视频号](https://space.bilibili.com/106325238?spm_id_from=333.1007.0.0)查看本次项目实践视频或更多免费教程，梦兽编程不定时直播写代码。

通过上次的[MongoDB的基本操作](http://rexweb.link/2023/09/05/5-MongoDB%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/),但是MongoDB是一个进程，在Next.js的Node进程中我们要如何操作MongoDB呢？

梦兽编程这里推荐使用Mongoose，只要你学会了使用MongoDB那么Mongoose也自然会，因为Mongoose很多的api和操作都是直接参考MongoDB的bson来设计的。其实这样归功于javascript本身对json格式操作就很舒服。

# Mongoose 是什么？
Mongoose是一个强大的、基于Node.js的MongoDB对象模型工具，它可以让我们更方便地在Node.js环境中操作MongoDB。在这篇文章中，我们将详细介绍如何使用Mongoose进行数据库的连接、数据的查询、插入、更新和删除等操作。

## 1. 安装Mongoose

首先，我们需要在我们的项目中安装Mongoose。在你的项目目录中，运行以下命令：

```shell
npm install mongoose
```

## 2. 连接到MongoDB
```shell
const mongoose = require('mongoose');
# 这是一个标准的mongoose连接字符串,你给出以下格式mongoose就会给你启动MongoDB Client客户端，不同语言不同library连接字符串可能不一样

# /test 为我们需要用到的数据库
mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true, useUnifiedTopology: true});
```

## 3. 定义模型
在Mongoose中，模型（Model）是由Schema构造函数生成的构造函数。每个模型都是一个独立的数据库实体，有自己的文档和方法。模型的主要职责是在数据库中创建和读取文档。

模型的作用主要体现在以下几个方面：

1. 数据结构定义：模型通过Schema定义了文档的结构，包括字段名、字段类型、默认值、验证器等。这为数据提供了一致性和可预测性。

2. 数据验证：模型可以定义验证规则，如必填字段、唯一性约束、自定义验证函数等。在保存文档到数据库之前，Mongoose会自动执行这些验证。

3. 查询构建：模型提供了丰富的查询API，如find、findOne、findById等，可以方便地从数据库中读取和搜索文档。

4. 实例方法和静态方法：模型可以定义实例方法和静态方法。实例方法为每个文档实例添加新的方法，静态方法为模型本身添加新的方法。

5. 中间件：模型可以定义中间件（也称为pre和post钩子），在某些操作（如保存文档、删除文档）之前或之后执行特定的逻辑。

6. 数据映射：模型将数据库中的数据映射到JavaScript对象，使得我们可以使用JavaScript的语法和方法来操作数据库。

> 用oop编程来来讲就是我们的数据库表和具体表中的一条数据对象的抽象类。

模型支持那些类型请到这里查阅[schematypes](https://mongoosejs.com/docs/schematypes.html)

```shell
const Schema = mongoose.Schema;

const blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});

const Blog = mongoose.model('Blog', blogSchema);
```

## 4. 插入数据
使用模型的`save`方法，我们可以将数据保存到数据库中：
```ts
const myBlog = new Blog({ title: 'Mongoose Guide', author: 'John Doe' });

myBlog.save()
  .then(doc => {
    console.log(doc.title + " saved to bookstore collection.");
  })
  .catch(err => {
    console.error(err);
  });
```

## 5. 查询数据
Mongoose提供了多种查询数据的方法，如find，findOne，findById等：
```ts
// find all blogs
Blog.find()
  .then(blogs => {
    console.log(blogs);
  })
  .catch(err => {
    console.error(err);
  });
/*
// find 完全可以使用和MonogoDB一样的方式进行查询减少学习成本
Blog.find({ title: { $gte: 21, $lte: 65 } });
*/

// find blog by id
Blog.findById(myBlog._id)
  .then(blog => {
    console.log(blog);
  })
  .catch(err => {
    console.error(err);
  });
```

## 6. 更新数据
使用updateOne，updateMany或findByIdAndUpdate方法，我们可以更新数据库中的数据：
```ts
Blog.updateOne({ title: 'Mongoose Guide' }, { title: 'Mongoose Guide Updated' })
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.error(err);
  });
```
## 7.0 删除数据
使用deleteOne，deleteMany或findByIdAndDelete方法，我们可以删除数据库中的数据：
```ts
Blog.deleteOne({ title: 'Mongoose Guide Updated' })
  .then(() => {
    console.log('Blog deleted');
  })
  .catch(err => {
    console.error(err);
  });
```
# 结语
以上就是使用Mongoose操作MongoDB的基本方法基本一致。在实际使用中，你可能需要根据具体的需求来调整这些操作。希望这篇文章能帮助你更好地理解和使用Mongoose。如果你有任何问题或者需要进一步的帮助，欢迎随时向我提问。

![截屏2023-08-17 23.44.00.png](https://x.imgs.ovh/x/2023/09/04/64f5f2c94bf2c.png)

感谢你的阅读，期待在下一篇文章中再次见到你！

这里是梦兽编程，本次的代码更新将会放在Github[本次项目的Github连接](https://github.com/rexleimo/rex-huaban)中的V3.0分支中

[我的B站视频号](https://space.bilibili.com/106325238?spm_id_from=333.1007.0.0)更多视频动态。

![截屏2023-08-18 00.02.24.png](https://x.imgs.ovh/x/2023/09/04/64f5f2c85195a.png)