Advertisement

Introduction to NoSQL databases like MongoDB for Big Da

阅读量:

作者:禅与计算机程序设计艺术

1.简介

NoSQL(Not Only SQL)数据库是一种非关系型数据库,在于相比传统的关系型数据库而言它更加灵活并且能够存储海量数据。与传统的基于关系型模型的数据库不同,NoSQL数据库无需预先定义详细的表结构也不依赖固定的查询语言这意味着开发人员可以根据实际需求自由选择适合的数据库架构并将数据分布在不同的节点上同时保证了数据的一致性.NoSQL数据库已经成为云计算和大数据分析等领域发挥着重要作用许多公司都在基于NoSQL数据库进行大数据分析本文将介绍MongoDB作为一种NoSQL数据库的具体使用方法以及一些常用操作的基本原理和操作流程

2.基本概念术语说明

2.1 文档数据库(Document Databases)

首先我们需要明确一下什么是文档数据库?

Document databases refer to a category of database management systems designed to use JSON格式的数据结构,并提供基于这些数据结构的查询和索引功能。
这类数据库中的文档类似于关系型数据库中的记录或行,
但与传统的RDBMS不同的是,
它们没有预先定义好的模式或表。

而是通过允许开发者存储各种层次结构的数据,
提供了更大的灵活性。

每个单独的文档独立于其他文档存储,
因此可以根据不同的需求进行定制。

此外,
集合上的查询比标准SQL查询更快,
因为文档通常只包含所需的信息,
并且可以根据常用查询字段自动创建索引。

简而言之,文档型数据库系统是以JSON格式的数据单元作为其数据模型,并提供针对这些数据单元的检索与索引功能。相较于传统的关系型数据库,在设计阶段无需在预先定义好的表架构中指定字段或列;这赋予了开发者自由灵活地存储结构化的、半结构化的以及嵌套式数据的能力。每个独立的数据单元以自成一体的方式存储,在执行集合查询时往往比标准SQL更为高效;这主要是因为文档通常仅包含必要的信息内容,并能自动建立针对查询中常见字段的索引机制。

2.2 MongoDB简介

为了更好地掌握MongoDB知识,请先了解这一款功能强大的NoSQL数据库系统及其核心功能特点。MongoDB( MongoDB系统)作为当前最热门的非关系型数据库之一,在现代数据管理领域发挥着重要作用

该数据库系统(源自"humongous")是一个跨平台的文档导向型数据库程序。被归类为非关系型数据库程序的MongoDB使用类似于JSON的数据结构,并采用无模式设计。该系统支持字段查询、索引以及聚合操作,并且能够方便地整合到Web应用程序和微服务架构中。MongoDB提供高可用性、可扩展性和冗余性等特性,在需要时允许用户横向扩展至多个服务器。

MongoDB是一种面向文档式的多平台存储系统,在分类上属于非关系型数据库。它采用与JSON相似的数据结构以及无模式架构,并支持字段查询、索引构建以及数据聚合操作;该系统不仅提供高效的字段查询与索引服务,并且支持数据聚合操作;同时具备良好的集成能力,在Web应用程序及微服务架构中均可轻松部署。该存储解决方案具备高可用性、可扩展性和数据冗余特性;通过按需水平伸缩策略实现资源优化配置。

2.3 数据库模式(Database Schema)

文档数据库基于文档模型运行,在该模型下由一系列键值对构成的数据集形成结构化存储。其中每个键被定义为字段名(field name),对应的数据则被定义为字段值(field value)。在文档数据库环境中,默认情况下每个文档被视为独立对象存放在集合(collection)中。每一个集合均具有独特的名称标识符,并且支持包含任意数量的字段信息以满足复杂数据需求。

为了提升数据库模型的灵活性, 集合不仅可以选择预设模式或结构, 而且提供多样化的选择空间. 这种设计赋予开发者足够的自主权来定制数据架构和组织形式, 从而以适应多样化的查询需求. 每个集合都有独立的安全策略设置, 实现对读写操作的安全粒度管理, 使其具备企业级数据仓库或缓存层的能力

3.核心算法原理和具体操作步骤以及数学公式讲解

3.1 安装配置

相对容易地进行MongoDB的配置,在获取了mongoDb的安装文件后,遵循官方指南即可完成整个过程。启动mongoDb服务端程序后,在通过客户端程序连接到mongoDb服务端口的基础上,可以通过命令行工具对数据库进行管理

3.2 连接MongoDB

3.2.1 通过命令行管理MongoDB

首先,我们需要打开命令行窗口,输入如下命令启动MongoDB的服务端:

复制代码
    mongod --dbpath c:/data/db
    
    
    代码解读

这里,请注意--dbpath参数标识了数据文件的位置,在缺省情况下,默认生成C:\data\db文件夹。随后,请开启另一个命令行窗口,并通过以下命令与MongoDB客户端建立连接:

复制代码
    mongo
    
    
    代码解读

连接成功后,我们就可以通过MongoDB命令行来管理数据库了。

3.2.2 使用驱动管理器连接MongoDB

除了通过命令行工具进行数据库管理之外

复制代码
    <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.10.2</version>
    </dependency>
    
      
      
      
      
    
    代码解读

可以通过这个工具,在我们的开发项目中集成MongoDB Java Driver,并采用以下代码实现 MongoDB 连接

复制代码
    import com.mongodb.*;
    
    public class MongoDemo {
    
    public static void main(String[] args) throws Exception {
        // 创建连接对象
        MongoClient client = new MongoClient("localhost", 27017);
    
        // 获取数据库对象
        DB db = client.getDatabase("test");
    
        // 获取集合对象
        DBCollection coll = db.getCollection("myColl");
    
        // 插入文档
        BasicDBObject doc = new BasicDBObject();
        doc.put("name", "zhangsan");
        doc.put("age", 20);
        ObjectId id = coll.insert(doc);
        System.out.println("插入的_id值为:" + id.toString());
    
        // 查询文档
        DBCursor cursor = coll.find();
        while(cursor.hasNext()) {
            DBObject obj = cursor.next();
            String name = (String)obj.get("name");
            int age = (Integer)obj.get("age");
            System.out.println("姓名:" + name + ", 年龄:" + age);
        }
    }
    
    }
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3.2.3 配置文件管理MongoDB

尽管通过命令行界面或驱动管理器与MongoDB建立连接相对便捷,但这依然存在一定的不便,尤其是当涉及多机部署时。此时,则可以通过配置文件来配置MongoDB的相关参数。在配置文件中,我们可以为MongoDB设置必要的连接信息,包括数据库地址、端口号等关键细节。这样一来,在调整配置文件后重新启动服务端将能够迅速建立新的MongoDB集群。

3.3 操作文档数据库

3.3.1 插入文档

第一步我们需要获取待操作的目标集合体。
接下来我们构造一个新的BasicDBObject实例并填充需要插入的内容。
最后调用insert()方法传入要插入的内容MongoDB会自动生成新的文档ID并返回结果数据体。

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 插入文档
    BasicDBObject doc = new BasicDBObject();
    doc.put("name", "zhangsan");
    doc.put("age", 20);
    ObjectId id = coll.insert(doc);
    System.out.println("插入的_id值为:" + id.toString());
    
      
      
      
      
      
      
      
      
    
    代码解读

3.3.2 删除文档

删除文档的方式有两种:第一类基于_id字段直接删除;第二类则通过条件语句实现过滤性删除

通过_id删除文档

第一步我们需要获取要操作的集合对象之后我们再创建一个BasicDBObject对象里面包含_id字段值并调用remove()方法传入_id值就可以删除指定文档

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 通过_id删除文档
    coll.remove(new BasicDBObject("_id", id));
    
      
      
      
      
    
    代码解读
利用条件语句删除文档

第一步要做的是获取需要操作的对象集合体。随后需要创建一个DBObject实例,并将其配置好所需的搜索条件参数。接着调用remove()方法并传递搜索条件参数即可实现删除符合条件的所有数据体。

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 利用条件语句删除文档
    coll.remove(new BasicDBObject("age", greaterThan(25)));
    
      
      
      
      
    
    代码解读

3.3.3 更新文档

更新文档的方法分为两种:一种是直接更新,另一种是利用查询条件更新。

直接更新文档

首先第一步需要获取要操作的对象集合。随后我们创建一个BasicDBObject对象将需要更新的内容进行封装最后调用update()方法传递给update()方法作为条件参数并包含需要更新的内容就可以完成整个文档的更新过程

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 直接更新文档
    BasicDBObject updateDoc = new BasicDBObject();
    updateDoc.put("$set", new BasicDBObject("age", 25));
    coll.update(new BasicDBObject("_id", id), updateDoc);
    
      
      
      
      
      
      
    
    代码解读
利用查询条件更新文档

首先被获取到的是一个集合对象。
随后被生成的一个DBObject对象内嵌带有查询条件的部分信息,
接着又被生成另一个DBObject对象来整合更新的数据内容,
最后通过执行update()操作,
将之前设定的查询条件与最新的更新内容结合起来,
从而实现了符合条件文档数据的一次性更新过程

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 利用查询条件更新文档
    BasicDBObject updateDoc = new BasicDBObject();
    updateDoc.put("$set", new BasicDBObject("age", 25));
    coll.update(new BasicDBObject("age", lessThan(25)), updateDoc);
    
      
      
      
      
      
      
    
    代码解读

3.3.4 查询文档

有两类方法用于查询文档:其一是直接检索所有文档;其二是通过设定特定搜索参数来筛选出符合条件的结果。

查找全部文档

第一步是需要我们去获取所要进行操作的对象集合。接着, 调用find()方法能够有效地检索出所有的文档.

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 查找全部文档
    DBCursor cursor = coll.find();
    while(cursor.hasNext()) {
    DBObject obj = cursor.next();
    String name = (String)obj.get("name");
    int age = (Integer)obj.get("age");
    System.out.println("姓名:" + name + ", 年龄:" + age);
    }
    
      
      
      
      
      
      
      
      
      
      
    
    代码解读
利用查询条件查找匹配的文档

首先,请我们获取待操作的目标集合对象。随后,请我们创建一个DBObject对象(其中嵌入查询条件参数)。请调用find()方法(传入所需的查询条件参数),从而检索出符合要求的所有文档数据。

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 利用查询条件查找匹配的文档
    DBObject query = new BasicDBObject().append("name", "lisi").append("age", greaterThan(18));
    DBCursor cursor = coll.find(query);
    while(cursor.hasNext()) {
    DBObject obj = cursor.next();
    String name = (String)obj.get("name");
    int age = (Integer)obj.get("age");
    System.out.println("姓名:" + name + ", 年龄:" + age);
    }
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3.3.5 分页查询文档

分页获取文档的方法非常简单,无需设置额外的参数即可完成.

首先是一个步骤是获取需要进行操作的对象集合。随后创建一个DBObject实例用于封装查询条件设置参数值并执行查询操作。进而调用find()方法传递必要的查询参数就能返回符合条件文档结果集的部分数据集。

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 利用查询条件分页查询文档
    int skipNum = 0; // 表示跳过前几条记录
    int limitNum = 10; // 每页显示多少条记录
    DBObject query = new BasicDBObject().append("name", "lisi").append("age", greaterThan(18));
    DBCursor cursor = coll.find(query).skip(skipNum).limit(limitNum);
    while(cursor.hasNext()) {
    DBObject obj = cursor.next();
    String name = (String)obj.get("name");
    int age = (Integer)obj.get("age");
    System.out.println("姓名:" + name + ", 年龄:" + age);
    }
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3.3.6 求总和、求平均值

计算总和与平均值的方法是对所有相关文档进行扫描,并累加或汇总相关的统计数据信息

首先,请确定需要操作的具体集合对象。随后,请创建一个DBObject对象,在其内部封装查询条件设置。接下来,请调用group()方法,并传递查询条件以及聚合表达式的方式进行参数配置。通过这种方式就可以获得所有符合条件文档的分组统计结果了

复制代码
    // 获取集合对象
    DBCollection coll = db.getCollection("myColl");
    
    // 求总和、求平均值
    DBObject keys = new BasicDBObject("_id", null);
    keys.put("totalAge", new BasicDBObject("$sum", "$age"));
    keys.put("avgAge", new BasicDBObject("$avg", "$age"));
    List<DBObject> result = coll.aggregate(Arrays.asList(new BasicDBObject("$match", new BasicDBObject("name", "lisi")))).
                group(new BasicDBObject("_id", null), keys).toArray();
    for(DBObject obj : result) {
    double totalAge = (Double)obj.get("totalAge");
    double avgAge = (Double)obj.get("avgAge");
    System.out.println("总年龄:" + totalAge + ", 平均年龄:" + avgAge);
    }
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3.4 其它功能

3.4.1 数据备份和恢复

MongoDB支持数据保存与恢复功能。通过手动运行mongodump命令来进行MongoDB数据库的数据保存操作,在完成之后将这些备份的数据导入至目标服务器上;此外还可以选择直接将原始数据文件复制至目标服务器位置以完成快速还原过程

执行备份

假设当前主机的IP地址是10.0.1.10,则可以执行如下命令备份数据库:

复制代码
    mongodump -h 10.0.1.10 -d test -o /tmp/dump
    
    
    代码解读

这里的-h参数决定了备份源主机IP地址的具体值;-d参数则确定了备份数据库名称;而-o参数则决定了备份文件存放的位置。运行完成后,在指定的/tmr/dump目录下生成了一个包含所有数据库文件的压缩包。

将备份数据导入到目标机器

为了简化操作流程,在设置目标机器的IP地址为10.0.1.20后,请按照以下步骤传输备份数据至目标设备。

复制代码
    mongorestore -h 10.0.1.20 -d myNewDb --drop /tmp/dump/test
    
    
    代码解读

此处使用-h选项指定目标主机的IP地址;通过-d选项设置新数据库名称;使用--drop选项指示目标数据库是否需要在操作前先清空数据;而/tmp/dump/test则是最近一次备份生成的tar格式压缩文件存放的具体路径。操作完成后,在目标服务器上生成名为myNewDb的新数据库,并将原有数据从原库同步至该库。

直接复制数据文件到目标机器

另外一种方法是避免使用mongorestore命令导入数据。你可以选择将数据文件移动至目标机器上,并启动MongoDB服务以同步数据到内存中。这种方法的主要缺点是操作效率较低,并且无法确保所有数据都得到完整同步。

全部评论 (0)

还没有任何评论哟~