
MongoDB 的无模式特性源于其文档存储方式,通常采用 BSON(二进制 JSON)格式。集合中每个文档结构可以各不相同,无需预先定义字段及其数据类型。
示例:
这种灵活性让 MongoDB 适应不断变化的数据模型,无需修改架构。
MongoDB 提供两种主要方法来建模文档间的关系:嵌入和引用。
嵌入:在单个文档中存储相关数据。
<code class="json"> {
"_id": 1,
"name": "john doe",
"orders": [
{ "orderid": 101, "total": 50 },
{ "orderid": 102, "total": 75 }
]
}</code>引用:将相关数据存储在单独的文档中,并使用引用(ObjectId)链接它们。
customerid 引用客户文档:<code class="json"> // 客户文档
{ "_id": 1, "name": "john doe" }
// 订单文档
{ "orderid": 101, "customerid": 1, "total": 50 }</code>一对多关系通常通过在“一”方文档中嵌入“多”方数据,或通过引用来建模。
<code class="json">{
"_id": 1,
"name": "john",
"addresses": [
{ "street": "123 main st", "city": "city a" },
{ "street": "456 elm st", "city": "city b" }
]
}</code><code class="json">// 父文档
{ "_id": 1, "name": "john" }
// 子文档
{ "addressid": 1, "street": "123 main st", "city": "city a" }</code>上限集合是一种固定大小的集合,达到大小限制后会自动覆盖最早的文档。上限集合适用于最新数据最重要的情况,例如日志或事件数据。
特性:
示例:
创建一个大小限制为 1MB,最多 1000 个文档的上限集合:
<code class="javascript">db.createCollection("logs", { capped: true, size: 1048576, max: 1000 })</code>在 MongoDB 中,文档大小直接影响性能。文档最大大小为 16MB。接近此大小的文档可能:
为了提高性能,保持文档精简并避免过度增长非常重要,尤其是在高写入环境中。
反规范化涉及复制数据到多个文档以减少连接的需要。通过嵌入相关数据,MongoDB 可以避免执行多个查询或连接,从而加快读取速度。
示例:不要在订单中引用产品,而是直接嵌入产品详细信息到订单文档中:
<code class="json">{
"_id": 101,
"customerid": 1,
"products": [
{ "productid": 1, "name": "laptop", "price": 1000 },
{ "productid": 2, "name": "phone", "price": 500 }
]
}</code>GridFS 是用于在 MongoDB 中存储和检索大型文件(大于 16MB)的规范。它将大型文件分割成块(通常为 255KB),并将它们作为文档存储在两个集合中:fs.files 和 fs.chunks。
示例:存储大型图像文件。
对于分层数据,您可以根据层次结构的深度和复杂性使用嵌入或引用。
<code class="json">{
"_id": 1,
"category": "electronics",
"subcategories": [
{ "name": "computers", "items": [...] },
{ "name": "phones", "items": [...] }
]
}</code><code class="json">// 类别文档
{ "_id": 1, "name": "electronics" }
// 子类别文档
{ "categoryid": 1, "name": "computers" }</code>TTL 索引会在指定时间段后自动从集合中删除文档,这对于会话信息或日志等过期数据非常有用。
语法:
<code class="javascript">db.collection.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )</code>createdAt 字段的时间戳后 1 小时(3600 秒)过期。多对多关系可以通过在每个文档中嵌入引用数组,或创建第三个集合来存储关系来建模。
<code class="json">// 用户文档
{ "_id": 1, "name": "alice", "groupIds": [1, 2] }
// 群组文档
{ "_id": 1, "name": "admin", "userIds": [1, 2] }</code><code class="json">// 关系文档
{ "userId": 1, "groupId": 2 }</code>MongoDB 提供灵活的模式设计功能,使其能够适应各种用例,包括复杂的关系和数据建模策略。正确的架构设计选择可以提高应用程序的性能和可扩展性。
作者:Abhay Singh Kathayat
全栈开发人员,精通前端和后端技术。 联系邮箱:kaashshorts28@gmail.com
以上就是在 MongoDB 中设计高效的数据模型:无模式、关系和性能优化的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号