Skip to content

9 - MongoDB

SQL和NoSQL的区别

SQL(Structured Query Language)和NoSQL(Not Only SQL)是两种不同类型的数据库系统。SQL是关系型数据库(RDBMS)的代表,而NoSQL则是非关系型数据库(NOSQL)的代表。以下是它们之间的一些主要区别:

数据模型:SQL数据库使用表格数据模型,数据被组织为行和列。而NoSQL数据库则使用各种不同的数据模型,包括文档、键值、列族和图形等。

数据结构:SQL数据库要求在设计表格结构时事先定义好列名和数据类型,而NoSQL数据库则支持动态的、非结构化的数据,可以随时添加或删除字段。

可扩展性:NoSQL数据库具有更好的可扩展性,可以通过分片和复制等方式轻松地增加处理能力和可靠性,而SQL数据库则需要使用更复杂的分区和复制技术。

事务处理:SQL数据库支持事务处理,确保数据的一致性和完整性,而NoSQL数据库则通常不支持事务处理,因此在数据一致性和完整性方面可能存在一些限制。

查询语言:SQL数据库使用SQL查询语言,可以完成复杂的查询操作,包括联合、交集、排序等。而NoSQL数据库则通常使用基于键值的查询语言,仅支持简单的查询操作。

MongoDB属于非关系型数据库。

SQLNoSQL
TableCollections
RowsDocuments
Columns

MongoDB Setup & Atlas

https://cloud.mongodb.com/

具体的注册和setup可以参考视频。

Mongoose, Models & Schemas

Mongoose

  • Mongoose is an ODM library - Object Document Mapping library.

Mongoose 是一个 Node.js 环境下的 Object Data Modeling(ODM)库,它为 MongoDB 数据库提供了一种优雅的、基于模型的方式来操作数据。Mongoose 的设计目标是让开发者能够更轻松地在 Node.js 应用程序中使用 MongoDB 数据库,它提供了一些方便的功能,如模型定义、查询构建、数据验证、中间件等。

Mongoose 提供了一种类似于 ORM(Object-Relational Mapping)框架的方式来操作 MongoDB 数据库,通过定义模型(Model)、文档(Document)和查询器(Query)等概念,使开发者能够更加方便地进行数据库操作。同时,Mongoose 还提供了一些方便的功能,如数据验证、查询构建器、中间件等,使得开发者能够更加轻松地构建复杂的应用程序。

Schemas

  • Schemas defines the structure of a type of data / document
    • Properties & property types

在 Mongoose 中,Schema 是用来定义 MongoDB 中集合(collection)的结构的一种机制,它类似于关系数据库中的表结构定义。Schema 定义了集合中的字段、数据类型、默认值、验证规则等信息,以及对这些字段进行操作的方法,例如增加、删除、修改等。通过定义 Schema,Mongoose 可以对 MongoDB 中的数据进行更加方便、强大的操作。

Schema 可以包含以下类型:

基本类型:String、Number、Date、Boolean、Buffer、ObjectID、Mixed 数组类型:[String]、[Number]、[Date]、[Boolean]、[Buffer]、[ObjectID]、[Mixed] 嵌套类型:包含其他 Schema 类型的对象

例如:

User SchemaBlog Schema
name(string), requiredtitle(string), required
age(string)snippets(string), required
bio(string), requiredbody(string), required

Models

Models allow us to communcate with database collections.

实战

注册,创建Clusters,创建Collections, 最后将DB地址放到app.js中

js
// connect to MongoDB
const dbURI = 'mongodb+srv://nekolas:admin123@webappcluster.rxnnbvp.mongodb.net/';

// 在.net/ 后面可以指定集合名称,如.net/learnNodeDB
// 如果不指定,系统会分发一个test 集合,并把数据存放其中

mongoose.connect(dbURI).then((r) => {
  console.log('connecting to db');
  app.listen(3000);
}).catch((err) => {
  console.log(err);
});

创建connect后重跑,发现报错:

MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted.

看到这个报错,只需要去 SECURTIY > Network Access > + ADD IP ADDRESS > ADD CURRENT IP ADDRESS

点击Confirm, 保存0.0.0.0/0 这个地址即可。

创建schema & model

在根目录下新建文件夹models,且新建blog.js。让我们在blog.js中创建一些blog schema,其实就是定义关于blog的一些字段和类型。

js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const blogSchema = new Schema({
  title: { type: String, required: true },
  snippets: { type: String, required: true },
  body: { type: String, required: true },
}, { timestamps: true });

根据我们定义的blog schema,我们可以创建一个model:

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

最后,需要将刚刚创建好的model export出去。

js
//...
module.exports Blog;

Getting & Saving

接下来我们试着将数据保存到数据库中。

js
// 引入model:
const Blog = require('./models/blog')

// 在new post 页面写一些内容
app.get('/new', (req, res) => {
  const blog = new Blog({
    title: '今天送水的好慢',
    snippets: '他是从桂林送过来的么',
    body: '从早上10点整到下午14:41,都够去桂林的来回了。真是有够慢的。'
  })

	// 调用save()方法,调用异步请求,将数据保存到数据库
  blog.save().then((r) => {
    console.log(r);
    res.send(r);
   }).catch((err) => {
    console.log(err);
  })
})

find方法读取所有blogs:

js
app.get('/all-blogs', (req, res) => {
  Blog.find().then((r) => {
    console.log(r);
    res.send(r);
   }).catch((err) => {
    console.log(err);
  })
})

findById方法读取某一篇blog:

js
app.get('/single-blog', (req, res) => {
  Blog.findById('648972ae90c7b60531212d46').then((r) => {
    console.log(r);
    res.send(r);
   }).catch((err) => {
    console.log(err);
  })
})

Outputting Documents in Views

是时候把数据库的blog渲染到页面了。

js
app.get('/blogs', (req, res) => {
// 找到所有的博文
  Blog.find().then((r) => {
  // 渲染,传参
    res.render('index',{title: 'About', blogs: r});
   }).catch((err) => {
    console.log(err);
  })
})

find()方法后可以接一个.sort()方法,对数据进行排序:

js
Blog.find().sort({ createdAt: -1}).then().catch()

上面写法根据创建时间的倒序排序,也就是最新的博文放在最上面。

Released under the MIT License.