当前位置: 首页 > news >正文

Web 开发 25

1 MongoDB 的结构

MongoDB Instance(MongoDB 实例)

一个 MongoDB 实例是一组数据库的集合。可以把它想象成一个大的容器,里面装着多个数据库,用于管理和组织不同的数据库资源。

Database(数据库)

以示例中的 “Catbook database” 为例,数据库是一组集合的组合,通常对应一个 Web 应用程序。也就是说,一个 Web 应用的数据可以存储在一个对应的数据库里,方便对该应用的数据进行集中管理。

Collection(集合)

比如示例里的 “Stories collection”,集合是一组非常相似的数据的集合。理想情况下,一个集合中的所有数据都应该具有相同的结构,也就是拥有相同的键(keys)和数据类型,这样能保证数据的一致性,便于后续对数据进行操作和查询。

Document(文档)

像示例中 “单个故事的数据”,文档是一个单独的 JSON 或 JavaScript 对象。它是应用程序中的单个数据片段,类似于 SQL 数据库中的一行数据,是 MongoDB 中存储数据的基本单元。

Field(字段)

例如 “单个故事的 content 属性”,字段是我们想要记录其值的一个属性,是 JavaScript 对象的一个键。它用于描述文档中的某个具体信息,就像 SQL 表中的列一样,用来定义数据的某个特征。

通过这些层级结构的概念,能清晰地理解 MongoDB 是如何组织和存储数据的,从大的实例到小的字段,层层嵌套,构成了 MongoDB 灵活且强大的数据存储体系。

 MongoDB(一种非关系型数据库)的结构

从图中可以看到,最上层是 “MongoDB Instance(MongoDB 实例)”,它包含多个 “Database(数据库)”;每个数据库又包含多个 “Collection(集合)”;每个集合里则包含多个 “Document(文档)”,文档是 MongoDB 中存储数据的基本单元。下方文字还将数据库类比成仓库或存储设施,帮助理解其存储数据的作用。

Mongoose Schema(模式)的作用

这张图展示了 Mongoose Schema(模式) 的作用,Mongoose 是在 Node.js 环境中操作 MongoDB 数据库的一个库,Schema 用于定义 MongoDB 中文档(Document)的结构。

左侧 Schema 定义

Schema({name: String,age: Number,hobbies: [String]
})

这里定义了一个 Schema,规定了文档应该包含的字段及对应的数据类型:

  • name 字段:类型为 String(字符串),用于存储名称。
  • age 字段:类型为 Number(数字),用于存储年龄。
  • hobbies 字段:类型为 [String](字符串数组),用于存储爱好列表。

右侧文档示例

{name: "Jay",age: 21,hobbies: ['reading', 'baking']
}

这个文档是实际存储在 MongoDB 中的数据,它符合左侧 Schema 定义的结构:

  • name 是字符串 "Jay",符合 String 类型要求。
  • age 是数字 21,符合 Number 类型要求。
  • hobbies 是字符串数组 ['reading', 'baking'],符合 [String] 类型要求。

整体作用

Schema 的作用就是约束文档的结构确保存入 MongoDB 的文档在字段和数据类型上与预先定义的规则一致,这样能让数据更规范,也方便后续对数据进行查询、修改等操作。

就像图中下方文字所说:“使用该模式时所匹配的文档实际上符合该模式”,保证了数据的一致性和规范性。

Mongoose(Node.js 中操作 MongoDB 的库)的结构

这张图展示了 Mongoose(Node.js 中操作 MongoDB 的库)的结构,清晰呈现了各部分如何协同工作来操作 MongoDB 数据库,以下是详细解释:

核心组件及流程

  1. api.js:这是应用程序中的一个文件(可以理解为业务逻辑层的代码文件)。它通过 “calls(调用)” 的方式,与 User Model 交互,发起对数据的操作请求,比如想查询用户数据、删除用户数据等。
  2. User Model(用户模型)
    • 包含 User Schema(用户模式):用于定义用户数据的结构,图中定义了 name(字符串类型)和 age(数字类型)这两个字段,规定了存入数据库的用户文档必须包含这些字段且类型符合要求。
    • 包含 User Operations(用户操作):提供了像 find()(查询)、delete()(删除)等操作方法,这些方法是对数据库进行具体操作的接口。
  3. Database(数据库):这里指的是 MongoDB 数据库,其中有 User Collection(用户集合),用于存储符合 User Schema 结构的用户文档。User Model 通过 “talks to(与…… 交互)” 的方式,和 User Collection 进行通信,执行数据的增删改查等操作。

整体作用

底部文字说明:“Models are responsible for creating and reading documents from the underlying MongoDB database.”(模型负责从底层 MongoDB 数据库创建和读取文档)。

简单来说,User Model 是连接应用程序(通过 api.js)和 MongoDB 数据库的桥梁,它基于 User Schema 定义的数据结构,利用 User Operations 提供的方法,对数据库中的 User Collection 进行操作,从而实现数据的管理。

Mongoose(用于在 Node.js 环境中操作 MongoDB 数据库的库)的 Schema(模式)类型

Mongoose(用于在 Node.js 环境中操作 MongoDB 数据库的库)的 Schema(模式)类型

列出的 Schema 类型有:

  • String(字符串类型)
  • Number(数字类型)
  • Date(日期类型)
  • Buffer(二进制数据类型)
  • Boolean(布尔类型)
  • Mixed(混合类型,可存储任意类型数据)
  • ObjectId(对象标识符类型,用于唯一标识文档)
  • Array(数组类型)

链接 http://mongoosejs.com/docs/schematypes.html,可用于了解更多关于 Schema 类型的信息。

Mongoose 中的 Models(模型)相关内容,Mongoose 是一个在 Node.js 环境下操作 MongoDB 数据库的对象模型工具。

模型的功能

  • Construct documents(构建文档):通过定义好的模型,可以创建符合特定结构和验证规则的文档。例如,定义了一个用户模型,包含姓名、年龄等字段,就能使用该模型创建具体的用户文档实例。
  • Get documents fitting the model(获取符合模型的文档):利用模型,可以在 MongoDB 数据库中查询获取满足该模型定义结构的文档。比如,通过用户模型去查询数据库中所有用户文档。
  • Post documents(提交文档):可以将新创建的文档通过模型提交到 MongoDB 数据库中进行存储。例如,创建一个新的用户文档后,使用用户模型将其保存到数据库的用户集合中。
  • ...or anything with documents fitting the model!(以及任何与符合模型的文档相关的操作):除了上述操作外,模型还可以用于对符合其定义的文档进行各种操作,比如更新文档、删除文档等。

模型的本质和作用

图片中提到 “Models are like objects, but we can also use them to query or modify the database!” ,意思是模型类似于对象,但我们还可以使用它们来查询或修改数据库 。

模型不仅定义了数据的结构和验证规则,还提供了一系列方法来对数据库中的数据进行操作,它是连接应用程序和 MongoDB 数据库的桥梁,方便开发者以面向对象的方式对数据库进行高效管理。

5 在 Node.js 中操作 MongoDB 数据库

【这个直接用js写是不是?要不要下载库的,详细解释一下有关代码】

这段代码是用 Node.js 编写的,并且需要下载相关库(mongoose 库)才能运行,因为 mongoose 不是 Node.js 内置的模块,是用于在 Node.js 中操作 MongoDB 数据库的第三方库。下面对代码逐行详细解释:

1. 引入 mongoose 库

const mongoose = require("mongoose");
  • require("mongoose"):这是 Node.js 中引入第三方模块的方式,作用是将 mongoose 库加载到当前代码文件中,后续就可以使用 mongoose 提供的各种方法和功能来操作 MongoDB 数据库了。

2. 定义 MongoDB 连接相关配置

const mongoConnectionSRV = "mongodb+srv://user:password@somecluster.gcp.mongodb.net/test?retryWrites=true&w=majority";
const databaseName = "test";
const options = { useNewUrlParser: true, useUnifiedTopology: true, dbName: databaseName };
  • mongoConnectionSRV:这是 MongoDB 的连接字符串,用于指定要连接的 MongoDB 数据库集群。其中 user 和 password 是数据库的用户名和密码,somecluster.gcp.mongodb.net 是数据库集群的地址,test 是要连接的数据库名称,retryWrites=true&w=majority 是一些连接参数,retryWrites 表示在写入失败时重试,w=majority 表示写入操作需要大多数节点确认才算成功。
  • databaseName:明确要连接的数据库名称为 test
  • options:是连接 MongoDB 时的配置对象。useNewUrlParser: true 表示使用新的 URL 解析器,useUnifiedTopology: true 表示使用新的服务器发现和监控引擎,dbName: databaseName 指定要连接的数据库名称。

3. 连接 MongoDB 数据库

mongoose.connect(mongoConnectionSRV, options).then(() => console.log("Connected.")).catch((error) => console.log(error));
  • mongoose.connect():这是 mongoose 提供的连接 MongoDB 数据库的方法,它接收两个参数,第一个是连接字符串(mongoConnectionSRV),第二个是配置对象(options)。
  • .then(() => console.log("Connected."))mongoose.connect() 方法返回一个 Promise 对象,当数据库连接成功时,会执行 then 方法里的回调函数,在控制台打印 "Connected.",表示连接成功。
  • .catch((error) => console.log(error)):如果数据库连接失败,会执行 catch 方法里的回调函数,将错误信息(error)打印到控制台。

4. 定义 Schema(模式)

const UserSchema = new mongoose.Schema({name: String,age: Number,pets: [String],
});
  • mongoose.Schemamongoose 中的 Schema 用于定义 MongoDB 中文档(Document)的结构。这里创建了一个名为 UserSchema 的模式,规定了文档应该包含的字段及对应的数据类型:
    • name 字段:类型为 String(字符串),用于存储用户的姓名。
    • age 字段:类型为 Number(数字),用于存储用户的年龄。
    • pets 字段:类型为 [String](字符串数组),用于存储用户拥有的宠物名称列表。

5. 创建 Model(模型)

const User = mongoose.model("User", UserSchema);
  • mongoose.model()mongoose 中的 model 方法用于根据定义的 Schema 创建模型。模型是 mongoose 中用于和数据库集合(Collection)进行交互的工具,它基于 Schema 定义的数据结构,提供了对数据库进行增删改查等操作的方法。这里创建了一个名为 User 的模型,对应的数据库集合名称会默认是模型名称的小写复数形式,也就是 users 集合,它使用的模式是 UserSchema

6. 创建文档实例并保存到数据库

let Tim = new User({ name: "Tim", age: 21, pets: ["cloudy"] });Tim.save().then((student) => console.log(`Added ${student.name}`)).catch((error) => console.log(error));
  • new User({ name: "Tim", age: 21, pets: ["cloudy"] }):使用 User 模型创建了一个名为 Tim 的文档实例,这个实例包含 name 为 "Tim"age 为 21pets 为 ["cloudy"] 的数据,符合 UserSchema 定义的结构。
  • Tim.save()save() 是模型实例(这里的 Tim 就是 User 模型的实例)提供的方法,用于将文档实例保存到 MongoDB 数据库中。save() 方法返回一个 Promise 对象。
  • .then((student) => console.log(Added ${student.name})):当文档成功保存到数据库后,会执行 then 方法里的回调函数,这里的 student 参数是保存后的文档对象,在控制台打印 Added Tim,表示成功添加了名为 Tim 的用户文档。
  • .catch((error) => console.log(error)):如果在保存文档过程中出现错误,会执行 catch 方法里的回调函数,将错误信息打印到控制台。

总结

要运行这段代码,需要先在项目目录下通过 npm(Node.js 的包管理工具)安装 mongoose 库,命令为 npm install mongoose

安装完成后,才能通过 require("mongoose") 引入并使用 mongoose 相关功能来连接 MongoDB 数据库、定义数据结构以及进行数据的增删改查等操作。

6 用 User.find(过滤条件) 灵活查询 MongoDB 文档

这张图讲解的是 Mongoose(Node.js 操作 MongoDB 的库)中查询文档(Finding Documents) 的相关内容,核心是利用 find() 方法结合过滤参数来查询 MongoDB 中的文档,以下是详细解释:

关键说明文字

“You can add as many parameters as you want to the filter. This is very useful!”意思是:你可以向过滤器(filter,即 find() 方法的查询条件参数)中添加任意多的参数,这非常有用

代码示例解释

假设我们有一个 User 模型(基于 Mongoose 定义,对应 MongoDB 中 users 集合,用于操作用户相关文档),下面逐行解释代码:

1. 查询所有文档
// Returns all documents
User.find({}).then((users) => console.log(`Found ${users.length} users`));
  • User.find({})find() 是 Mongoose 模型提供的查询方法,传入空对象 {} 作为查询条件时,表示查询集合中的所有文档(即不设置任何过滤条件,返回所有用户文档)。
  • .then((users) => console.log(Found ${users.length} users))find() 方法返回一个 Promise,当查询成功时,会执行 then 里的回调函数。users 是查询到的文档数组,通过 users.length 可以获取查询到的用户数量,并打印出来。
2. 查询年龄为 21 的所有用户
// Returns all users age 21
User.find({ age: 21 }).then((users) => console.log(`Found ${users.length} users`));
  • User.find({ age: 21 }):在 find() 的查询条件中传入 { age: 21 },表示只查询 age 字段值为 21 的文档(即年龄为 21 岁的用户)。
  • 后续的 .then 逻辑和上面一致,用于打印查询到的符合条件的用户数量。
3. 查询名字为 “Tim” 且年龄为 21 的所有用户
// Returns all users age 21 named Tim
User.find({ name: "Tim", age: 21 }).then((users) => console.log(`Found ${users.length} users`));
  • User.find({ name: "Tim", age: 21 }):在查询条件中同时指定 name: "Tim" 和 age: 21,表示查询名字是 “Tim” 且年龄为 21 岁的文档(多条件组合过滤)。
  • 这里体现了 “可以添加任意多参数到过滤器” 的特点 —— 通过多个键值对组合,能更精准地定位需要的文档。

底部文字补充

“超过文档或模式中实际存在的字段数量,这是因为你不能过滤 more than there are actually fields in the document or in the schema, but that's”(结合上下文,完整意思是:(注意,你添加的过滤字段)不能超过文档或模式中实际存在的字段数量,因为你无法根据文档或模式里不存在的字段来过滤,但这一点……)。

这句话是在强调:过滤条件里的字段,必须是 MongoDB 文档中实际存在的字段(或 Mongoose Schema 中定义过的字段)

如果用文档里没有的字段做过滤,查询是无效的(比如文档里没有 hobby 字段,却写 User.find({ hobby: "reading" }),就查不到结果)。

总结来说,这张图核心是教你如何用 User.find(过滤条件) 灵活查询 MongoDB 文档,既可以查全部,也能通过单条件、多条件组合精准查询,同时要注意过滤字段必须是文档中实际存在的。

这张图片主要是关于 Mongoose(用于在 Node.js 中操作 MongoDB 数据库的工具库)的参数相关文档指引

图片提供了几个 Mongoose 官方文档的链接:

http://mongoosejs.com/docs/schematypes.html:来自 “All Schema Types”(所有模式类型),用于了解 Mongoose 中各种模式(Schema)类型的信息。

http://mongoosejs.com/docs/validation.html:更高级的内容,涉及 Mongoose 中的数据验证相关知识。

http://mongoosejs.com/docs/guide.html:更高级的内容,是 Mongoose 的指南类文档,能帮助深入学习 Mongoose 的使用。

底部文字也说明 “总的来说,这里有一些关于 Mongoose 模式类型的文档”,这些链接可用于进一步学习 Mongoose 的相关知识。

http://www.dtcms.com/a/463358.html

相关文章:

  • 网站seo分析报告案例wordpress 手机更新
  • 成都软件定制宁波seo整站优化
  • 网站建立计划书南宁平台公司
  • 住建设部官方网站wordpress主题编辑
  • 网站需要什么服务器重庆市建设工程信息网劳务资质查询
  • 华为公司电子商务网站建设策划书网站建设 微信营销
  • 如何让搜索引擎不收录网站潮州东莞网站建设
  • 【OA办公系统】神点企业OA办公助手/全开源
  • 网站做支付宝花呗分期制作公司网站设计手绘
  • 10黄页网站建设四川在建项目信息查询
  • 广西建设工会网站个人游戏开发者 死路一条
  • 网站制作自己绍兴高端网站开发
  • 公司网站微信平台建设的好处山东建设执业资格注册中心网站
  • 网站后期维护内容搭建网站合同
  • 江西东乡网站建设wordpress中文语言
  • 推广app赚佣金平台有哪些南通优普网站建设优化
  • 建设一个网站需要那些技术医疗营销网站建设方案
  • 网站点击率如何做不要轻易注册一家公司
  • 重庆华鼎达网站建设连云港企业建站 网站
  • 张家港做网站的ai建筑设计平台
  • 做资源网站盈利点ps加dw做网站
  • 2014网站seo电商网站设计的企业
  • 中国建设的网站东莞网站建设方案咨询
  • 不用淘宝客api如何做网站wordpress 建站完整视频教程
  • 网站建设的工作总结wordpress网页加载太慢了
  • 甘肃营销型网站建设行业门户网站建设
  • Linux——删除文件夹中的 .DS_Store
  • 推荐软件分类女生做sem还是seo
  • 小题狂做 官方网站建设境外网站
  • linux系统怎么做网站网站建设须知