在 MongoDB 中定义 schema
本文将讨论 MongoDB Schema 以及如何定义它。
MongoDB 中的Schema
数据的结构和内容由 Schema 定义,架构是一个 JSON 对象。 Realm 的 BSON 模式扩展了 JSON 模式标准,可用于设计应用程序的数据模型并在创建、更改或删除文档时验证文档。
模式代表不同类型的数据,而不是精确的值。 Realm 支持许多内置模式类型。 可以组合文本、数字等基元和对象和数组等结构类型,以形成表示自定义对象类型的模式。
例如,下面给出了关于汽车和一些符合该模式的汽车对象数据的基本模式。
Schema:
{
"title": "car",
"required": [
"_id",
"year",
"make",
"model",
"kilometers"
],
"properties": {
"_id": { "bsonType": "objectId" },
"year": { "bsonType": "string" },
"make": { "bsonType": "string" },
"model": { "bsonType": "string" },
"kilometers": { "bsonType": "number" }
}
}
Objects:
{
"_id": ObjectId("5af712eff26b29dc5c51c60f"),
"year": "2022",
"make": "Honda",
"model": "Civic",
"kilometers": 123
}
{
"_id": ObjectId("5af714eff24b294c5251cf04"),
"year": "2016",
"make": "Honda",
"model": "City",
"kilometers": 135794
}
Schema 是应用程序的数据模型规范。 Realm 为您提供额外的工具和服务,以便在您定义数据后处理符合模式的数据。
Realm 中的许多应用程序服务都使用Schema:
- 为了在领域和 MongoDB Atlas 之间同步数据,领域同步使用模式。 根据您的模式,它还可以为您开发惯用的 SDK 对象模型。
- GraphQL API 自动使用模式来生成自动包含类型、查询和变更的 GraphQL 模式。 可以将引用模式定义的类型的自定义解析器添加到应用程序的 API 中。
- 在每次请求之前和之后,数据访问规则确保数据符合您的模式。 此外,如果任何文档未通过验证,Realm 会阻止或回滚整个请求。
在 MongoDB 中设计模式的注意事项
- 根据用户要求设计您的模式。
- 如果一起使用这些对象,请将它们合并到一个文档中。 如有必要,将它们分开(但要确保不需要连接)。
- 复制数据(但有限),因为磁盘空间比计算时间便宜。
- 在写作时加入,而不是在阅读时加入。
- 针对最常见的用例优化您的模式。
- 在模式中进行复杂的聚合。
下面给出了一个例子来解释这一点:
假设客户需要为他的博客或网站设计数据库,并看到 RDBMS 和 MongoDB 模式设计之间的差异。 该网站有以下要求。
- 每个帖子都有唯一的标题、描述和 URL。
- 每个帖子都可以有一个或多个标签。
- 每个帖子都有发布者的名字和喜欢的总数。
- 每个帖子都包含用户评论及其姓名、消息、数据时间和点赞数。
- 在每个帖子上,可以没有或更多评论。
在RDBMS schema 中,针对上述需求的设计至少会包含三个表。
而在 MongoDB 架构中,设计将有一个收集帖子和以下结构:
{
_id: POST-ID
title: TITLE-OF-POST,
description: POST-DESCRIPTION,
by: POST-BY,
url: URL-OF-POST,
tags: [TAG1, TAG2],
likes: TOTAL-LIKES,
comments: [
{
user: 'COMMENT-BY',
message: TEXT,
dateCreated: DATE-TIME,
like: LIKES
},
{
user: 'COMMENT-BY',
message: TEXT,
dateCreated: DATE-TIME,
like: LIKES
}
]
}
所以,在RDBMS中,你必须组合三个表来展示数据; 然而,在 MongoDB 中,数据只显示一个集合中的数据。
在 MongoDB 中定义模式
可以在根级集合模式中找到指定类型属性的其他模式。 每个根级模式都是一个对象模式,如下所示:
{
"bsonType": "object",
"title": "<Type Name>",
"required": ["<Required Field Name>", ...],
"properties": {
"<Field Name>": <Schema>
}
}
用户可以使用以下任何受支持的模式类型来配置对象的属性:
- Object
- Array
- String
- Boolean
- ObjectId
- Binary Data
- Mixed
- Set
- Dictionary
使用 MongoDB 领域实施模式
MongoDB 集合上的所有写入操作(插入、更新和删除)都由 MongoDB Realm 根据集合架构进行验证。
它还会在每个请求前后检查每个文档,以确保所有属性都与架构一致,并且没有进行无效更改。
在将写入操作提交到您的集群之前,Realm 会检查所有文档写入的结果并将它们与模式进行比较。
如果请求中的任何写入操作的结果不符合模式而不对请求进行任何更改,则 MongoDB Realm 会向用户发送错误。
下面给出了一个例子。 集合具有以下架构:
{
"title": "person",
"properties": {
"_id": {"bsonType": "objectId" },
"name": {"bsonType": "string" }
}
}
对所有字段具有完全访问权限的用户希望更改特定文档中的名称字段。 他们询问以下内容:
collection.updateOne(
{ "_id": BSON.ObjectId("5ae782e48f25b9dc5c51c4d0") },
{ "$set": { "name": 22 } }
)
查询尝试将名称值设置为数字 22。尽管如此,架构仍指定该值是一个字符串。
即使用户获得了更新文档的授权,MongoDB Realm 也会拒绝此写入操作,因为写入结果不符合模式。
相关文章
在 MongoDB Shell 中列出所有数据库
发布时间:2023/05/11 浏览次数:75 分类:MongoDB
-
交互式 Mongo Shell 提供了多个用于获取数据的选项。 本文介绍了在 Mongo Shell 中列出数据库的几种不同方法。
MongoDB 中检查字段包含的字符串
发布时间:2023/05/11 浏览次数:137 分类:MongoDB
-
这篇文章解决了如何在 MongoDB 中使用正则表达式来确定字段是否包含字符串。在 MongoDB 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。
在 MongoDB 中 upsert 更新插入
发布时间:2023/05/11 浏览次数:162 分类:MongoDB
-
在 MongoDB 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findAndModify() 操作中使用。MongoDB 中的 upsert 查询 upsert 采用单个布尔参数。
如何卸载 MongoDB
发布时间:2023/05/11 浏览次数:180 分类:MongoDB
-
要从您的计算机中卸载 MongoDB,您必须先删除 MongoDB 服务、数据库和日志文件。使用这篇 MongoDB 文章,您将能够从 Ubuntu Linux、Mac 和 Windows 卸载 MongoDB。 请务必保留数据备份,因为一旦卸载,便
在 MongoDB 中存储日期和时间
发布时间:2023/05/11 浏览次数:199 分类:MongoDB
-
本 MongoDB 教程解释了 Date() 对象是什么以及如何使用 Date() 方法对集合进行排序。 这也将帮助您找到在 MongoDB 中显示和存储日期/时间的最佳方法。
MongoDB 按 ID 查找
发布时间:2023/05/11 浏览次数:139 分类:MongoDB
-
MongoDB 中的 find by Id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 ID 匹配的文档,则返回空值。
检查 MongoDB 服务器是否正在运行
发布时间:2023/05/11 浏览次数:127 分类:MongoDB
-
这篇 MongoDB 教程将告诉您如何检查是否安装了 MongoDB 以及安装的 MongoDB 服务器的版本。 它在 Windows、UBUNTU 和 MAC 等不同的操作系统中实现。
MongoDB 中的分页
发布时间:2023/05/11 浏览次数:140 分类:MongoDB
-
这篇文章将介绍什么是 MongoDB 中的分页。 为什么在 MongoDB 中需要分页以及在 MongoDB 中完成分页的不同方法或方式是什么。
MongoDB 从查询开始
发布时间:2023/05/11 浏览次数:135 分类:MongoDB
-
在这篇 MongoDB 文章中,用户将学习如何使用 $regex 进行开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。