MongoDB数据建模与文档设计

本文介绍了文档数据库MongoDB的概念,数据建模的最佳实践,如选择合适的数据类型和嵌套/引用策略,以及如何在Java中操作复杂的嵌套文档和数组。通过代码示例展示了创建、插入和查询包含嵌套结构的文档过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 文档数据库的概念

2. 数据建模的最佳实践

3. 复杂文档结构的设计

4. Java代码实践


1. 文档数据库的概念

MongoDB文档模型: MongoDB是一种文档数据库,它以BSON(Binary JSON)格式存储数据。文档是MongoDB中基本的数据单元,类似于关系型数据库中的行,但比行更灵活,可以包含嵌套文档和数组。

2. 数据建模的最佳实践

选择合适的数据类型: MongoDB支持丰富的数据类型,包括字符串、数字、日期、数组、嵌套文档等。在设计文档时,选择适当的数据类型以最好地反映数据的本质。

嵌套文档与引用的选择: 在MongoDB中,可以选择将相关数据嵌套在同一文档中,也可以选择使用引用将相关数据存储在不同的文档中。选择取决于数据的访问模式和查询需求。

3. 复杂文档结构的设计

嵌套数组和文档: MongoDB允许在文档中嵌套数组和文档,以便更好地表示复杂的数据关系。这对于存储包含多个值或子文档的字段非常有用。

4. Java代码实践

下面是一个Java代码示例,演示如何创建和插入一个包含嵌套文档和数组的复杂文档,以及如何查询该文档:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.util.Arrays;

public class ComplexDocumentExample {

    public static void main(String[] args) {
        try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) {
            MongoDatabase database = mongoClient.getDatabase("mydatabase");
            MongoCollection<Document> collection = database.getCollection("complexcollection");

            // 创建包含嵌套文档和数组的文档
            Document complexDocument = new Document("name", "John")
                    .append("age", 30)
                    .append("address", new Document("city", "New York").append("zip", "10001"))
                    .append("skills", Arrays.asList("Java", "MongoDB", "JavaScript"));

            // 插入文档
            collection.insertOne(complexDocument);

            // 查询文档
            Document result = collection.find().first();
            System.out.println(result.toJson());
        }
    }
}

返回结果解释:

在插入并查询后,你将看到类似以下的输出:

{
  "_id": ObjectId("60a9c13165d1b235f8e0bfa3"),
  "name": "John",
  "age": 30,
  "address": {
    "city": "New York",
    "zip": "10001"
  },
  "skills": ["Java", "MongoDB", "JavaScript"]
}

这表示成功插入和查询到一个包含嵌套文档和数组的复杂文档。

MongoDB数据库设计 MongoDB数据库设计全文共21页,当前为第1页。 MongoDB数据库 MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. No database is more productive to use. MongoDB is a document database, which means it stores data in JSON-like documents. We believe this is the most natural way to think about data, and is much more expressive and powerful than the traditional row/column model. MongoDB数据库设计全文共21页,当前为第2页。 Rich JSON Documents MongoDB数据库设计全文共21页,当前为第3页。 Powerful query language MongoDB数据库设计全文共21页,当前为第4页。 All the power of a relational database, and more... Full ACID transactions. 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。 Support for joins in queries. Two types of relationships instead of one: reference and embedded. MongoDB数据库设计全文共21页,当前为第5页。 一对多关系建模的三种基础方案 当你设计一个MongoDB数据库结构,你需要先问自己一个在使用关系型数据库时不会考虑的问题:这个关系中集合的大小是什么样的规模?你需要意识到一对很少,一对许多,一对非常多,这些细微的区别。不同的情况下你的建模也将不同。 Modeling One-to-Few One-to-Many One-to-Squillions MongoDB数据库设计全文共21页,当前为第6页。 Modeling One-to-Few 针对个人需要保存多个地址进行建模的场景下使用内嵌文档是很合适,可以在person文档中嵌入addresses数组文档 MongoDB数据库设计全文共21页,当前为第7页。 One-to-Many 以产品零件订货系统为例。每个商品有数百个可替换的零件,但是不会超过数千个。这个用例很适合使用间接引用---将零件的objectid作为数组存放在商品文档中(在这个例子中的ObjectID我使用更加易读的2字节,正常是由12个字节组成的)。 MongoDB数据库设计全文共21页,当前为第8页。 One-to-Squillions 我们用一个收集各种机器日志的例子来讨论一对非常多的问题。由于每个mongodb文档有16M的大小限制,所以即使你是存储ObjectID也是不够的。我们可以使用很经典的处理方法"父级引用"---用一个文档存储主机,在每个日志文档中保存这个主机的ObjectID。 MongoDB数据库设计全文共21页,当前为第9页。 内嵌,子引用,父引用 三种基本的设计方案:内嵌,子引用,父引用 在选择方案时需要考虑的两个关键因素:1)一对多中的多是否需要一个单独的实体;2)这个关系中集合的规模是一对很少,很多,还是非常多。 一对很少且不需要单独访问内嵌内容的情况下可以使用内嵌多的一方。 一对很多且很多的一端内容因为各种理由需要单独存在的情况下可以通过数组的方式引用多的一方的。 一对非常多的情况下,请将一的那端引用嵌入进多的一端对象中。 MongoDB数据库设计全文共21页,当前为第10页。 双向关联Two-Way Referencing 以任务跟踪系统为例。有person和task两个集合,one-to-n的关系是从person端到task端。在需要获取person所有的task这个场景下需要在person这个对象中保存有task的id数组 在某些场景中这个应用需要显示任务的列表(例如显示一个多人协作项目中所有的任务),为了能够快速的获取某个用户负责的项目可以在task
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着猪猪去旅行A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值