跳至主要內容
MongoDB 索引

MongoDB 索引

MongoDB 索引简介

索引的作用

MongoDB 在 collection 数据级别上定义索引

索引通常能够极大的提高查询的效率。如果没有索引,MongoDB 在读取数据时必须扫描 collection 中的每个 document 并选取那些符合查询条件的记录。

这种扫描全集合的查询是非常低效的,特别是在处理大量的数据时。查询可能要花费几十秒甚至几分钟,这种性能开销是不可接受的。


钝悟...大约 2 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB索引
MongoDB 的聚合操作

MongoDB 的聚合操作

聚合操作处理多个文档并返回计算结果。可以使用聚合操作来:

  • 将多个文档中的值组合在一起。
  • 对分组数据执行操作,返回单一结果。
  • 分析一段时间内的数据变化。

若要执行聚合操作,可以使用:


钝悟...大约 16 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB聚合
MongoDB 事务

MongoDB 事务

在 MongoDB 中,对单个文档的操作是原子的。由于可以使用嵌入式文档和数组来捕获单个文档结构中数据之间的关系,而不是跨多个文档和集合进行规范化,因此这种单文档原子性在许多实际用例中消除了对分布式事务的需求。

对于需要对多个文档(在单个或多个集合中)进行读取和写入原子性的情况,MongoDB 支持分布式事务。借助分布式事务,可以跨多个操作、集合、数据库、文档和分片使用事务。

【示例】使用 MongoDB Java Driver 进行事务操作

/*
  For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.
  String uri = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/admin?replicaSet=myRepl";
  For a sharded cluster, connect to the mongos instances.
  For example:
  String uri = "mongodb://mongos0.example.com:27017,mongos1.example.com:27017:27017/admin";
 */
final MongoClient client = MongoClients.create(uri);
/*
    Create collections.
 */
client.getDatabase("mydb1").getCollection("foo")
        .withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("abc", 0));
client.getDatabase("mydb2").getCollection("bar")
        .withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("xyz", 0));
/* Step 1: Start a client session. */
final ClientSession clientSession = client.startSession();
/* Step 2: Optional. Define options to use for the transaction. */
TransactionOptions txnOptions = TransactionOptions.builder()
        .writeConcern(WriteConcern.MAJORITY)
        .build();
/* Step 3: Define the sequence of operations to perform inside the transactions. */
TransactionBody txnBody = new TransactionBody<String>() {
    public String execute() {
        MongoCollection<Document> coll1 = client.getDatabase("mydb1").getCollection("foo");
        MongoCollection<Document> coll2 = client.getDatabase("mydb2").getCollection("bar");
        /*
           Important:: You must pass the session to the operations.
         */
        coll1.insertOne(clientSession, new Document("abc", 1));
        coll2.insertOne(clientSession, new Document("xyz", 999));
        return "Inserted into collections in different databases";
    }
};
try {
    /*
       Step 4: Use .withTransaction() to start a transaction,
       execute the callback, and commit (or abort on error).
    */
    clientSession.withTransaction(txnBody, txnOptions);
} catch (RuntimeException e) {
    // some error handling
} finally {
    clientSession.close();
}

钝悟...大约 3 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB事务
MongoDB 分片

MongoDB 分片

分片集群简介

当 MongoDB 需要存储海量数据时,单节点不足以存储全量数据,且可能无法提供令人满意的吞吐量。所以,可以通过 MongoDB 分片机制来支持水平扩展。

分片集群特点

对应用完全透明

数据自动均衡

动态扩容

提供三种分片方式

分片集群组件

MongoDB 分片集群含以下组件:

  • shard:每个分片包含分片数据的子集。每个分片都可以部署为副本集。
  • mongos:mongos 充当查询路由器,在客户端应用程序和分片集群之间提供接口。从 MongoDB 4.4 开始,mongos 可以支持 hedged reads 以最大程度地减少延迟。
  • config servers:提供集群元数据存储和分片数据分布的映射。

钝悟...大约 5 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB分片
MongoDB 复制

MongoDB 复制

副本和可用性

MongoDB 中的副本集是一组维护相同数据集的 mongod 进程。复制提供冗余并提高数据可用性。由于数据副本位于不同的数据库服务器上,复制提供了一定程度的容错能力,以防止单个数据库服务器丢失。


钝悟...大约 7 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB复制
MongoDB 建模示例

MongoDB 建模示例

关系型模型

嵌入式文档一对一关系模型

嵌入式文档一对一关系模型 - 嵌入式文档模式

// patron document
{
   _id: "joe",
   name: "Joe Bookreader"
}

// address document
{
   patron_id: "joe", // reference to patron document
   street: "123 Fake Street",
   city: "Faketon",
   state: "MA",
   zip: "12345"
}

钝悟...大约 7 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB建模
MongoDB 建模

MongoDB 建模

MongoDB 的数据模式是一种灵活模式,关系型数据库要求你在插入数据之前必须先定义好一个表的模式结构,而 MongoDB 的集合则并不限制 document 结构。这种灵活性让对象和数据库文档之间的映射变得很容易。即使数据记录之间有很大的变化,每个文档也可以很好的映射到各条不同的记录。 当然在实际使用中,同一个集合中的文档往往都有一个比较类似的结构。

数据模型设计中最具挑战性的是在应用程序需求,数据库引擎性能要求和数据读写模式之间做权衡考量。当设计数据模型的时候,一定要考虑应用程序对数据的使用模式(如查询,更新和处理)以及数据本身的天然结构。


钝悟...大约 10 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB建模
MongoDB 运维

MongoDB 运维

MongoDB 安装

Windows

(1)下载并解压到本地

进入官网下载地址:官方下载地址 ,选择合适的版本下载。

(2)创建数据目录

MongoDB 将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。


钝悟...大约 6 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB运维
MongoDB 教程

MongoDB 教程

MongoDB 是一个基于文档的分布式数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。

MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。


钝悟...大约 1 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB
2