MongoDB是个好东西,希望你也会

news/2024/7/5 3:02:19

点击上方“方志朋”,选择“置顶或者星标”

你的关注意义重大!

作者:hello_锦泰

原文:https://blog.csdn.net/hayre

最近在回顾mongodb的相关知识,输出一篇文章做为MongoDB知识点的总结。
总结的目的在于回顾MongoDB的相关知识点,明确MongoDB在企业级应用中充当的角色,为之后的技术选型提供一个可查阅的信息简报。

文章提纲:

1、MongoDB是什么?

2、为什么要使用MongoDB?

3、主要特性

4、C/S服务模型

5、完善的命令行工具

6、几个shell实操

7、在Java中使用MongoDB

1、MongoDB是什么?

MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库

2、为什么要用MongoDB?

(1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。

1{
2    username:'123',
3    password:'123'
4}

使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。

(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。

(3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。

3、主要特性

(1)文档数据类型

SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。

(2)即时查询能力

MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。

(3)复制能力

MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。

(4)速度与持久性

MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。 

MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据操作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。

(5)数据扩展

MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。

4、C/S服务模型

MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理最好是交给操作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。

MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。

5、完善的命令行工具

mongodump和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。

mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。

mongosniff,网络嗅探工具,用来观察发送到数据库的操作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。

因此,可以总结得到,MongoDB结合键值存储和关系数据库的最好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且最好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。

6、几个shell实操

因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。

1、切换数据库

1use dba

创建数据库并不是必须的操作,数据库与集合只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或集合被意外创建,可以开启严格模式

2、插入语法

1db.users.insert({username:"smith"})
2db.users.save({username:"smith"})

3、查找语法

1db.users.find()
2db.users.count()

4、更新语法

 1db.users.update({username:"smith"},{$set:{country:"Canada"}})2//把用户名为smith的用户的国家改成Canada34db.users.update({username:"smith"},{$unset:{country:1}})5//把用户名为smith的用户的国家字段给移除67db.users.update({username:"jones"},{$set:{favorites:{movies:["casablance","rocky"]}}})8//这里主要体现多值修改,在favorties字段中添加多个值9
10db.users.update({"favorites.movies":"casablance"},{$addToSet:{favorites.movies:"the maltese"}},false,true)
11//多项更新

5、删除语法

1db.foo.remove() //删除所有数据
2db.foo.remove({favorties.cities:"cheyene"}) //根据条件进行删除
3db.drop() //删除整个集合

6、索引相关语法

1db.numbers.ensureIndex({num:1})
2//创建一个升序索引
3db.numbers.getIndexes()
4//获取全部索引

7、基本管理语法

 1show dbs2//查询所有数据库3show collections4//显示所有表5db.stats()6//显示数据库状态信息7db.numbers.stats()8//显示集合表状态信息9db,shutdownServer()
10//停止数据库
11db.help()
12//获取数据库操作命令
13db.foo.help()
14//获取表操作命令
15tab 键 //能自动帮我们补全命令

以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去操作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。

7、在Java中使用MongoDB

1、使用maven引入jar包

这里引用的是最新的驱动包,提供了一套新的访问连接方式

1<dependency>
2  <groupId>org.mongodb</groupId>
3  <artifactId>mongodb-driver-sync</artifactId>
4  <version>3.8.0-beta3</version>
5</dependency>

2、创建一个访问客户端

1MongoClient client = MongoClients.create(“mongodb://10.201.76.94:27017”);

3、获取集合数量

1public long count() {
2        MongoClient client = this.getClient();
3        MongoCollection<Document> collections= client.getDatabase("mongodb_db_name").getCollection("mongodb_collection_name");
4        return collections.count();
5    }

4、查询集合

 1public List<Document> find(Document params,Bson sort,int skip,int limit) {2        MongoClient client = this.getClient();3        MongoCollection<Document> collections= client.getDatabase("mongodb_db_name").getCollection("mongodb_collection_name");4        List<Document> list = new ArrayList<Document>(Integer.valueOf(config.getPro("sync_limit")));5    collections.find(params).sort(sort).skip(skip).limit(limit).forEach(new Block<Document>() {6            @Override7            public void apply(Document document) {8                list.add(document);9            }
10        });
11        return list;
12    }

这里只举例了简单的链接与简单的MongoDB操作,可见其操作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。

插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。

-更多文章-

小说:白话幂等性设计

最详细的排序解析,理解七大排序

好文推荐,15 分钟教你搞懂 Git!

Spring Cloud Greenwich版本已发布!

-关注我-

看完了,帮我点个“好看”鸭

点鸭点鸭

↓↓↓↓


http://lihuaxi.xjx100.cn/news/280429.html

相关文章

详细介绍Python类的继承与多态

大家好&#xff0c;本篇文章主要讲的是Python类的继承与多态详细介绍&#xff0c;感兴趣的同学赶快来看一看吧&#xff0c;对你有帮助的话记得收藏一下&#xff0c;方便下次浏览 概念 类(Class): 用来描述具有相同的属性和方法的对象的集合。 类变量&#xff1a;类变量在整个…

4篇SCI,1篇A类期刊,这位复旦博士生分享自身科研经验

点击上方&#xff0c;选择星标或置顶&#xff0c;每天给你送干货&#xff01;阅读大概需要6分钟跟随小博主&#xff0c;每天进步一丢丢整理&#xff1a;募格学术本文来源&#xff1a;复旦管院李婷&#xff0c;复旦大学管理学院统计系2016级博士生&#xff0c;获复旦大学第十一届…

面向可解释的NLP:北大、哈工大等提出文本分类的生成性解释框架

作者 | Hui Liu, Qingyu Yin, William Yang Wang 译者 | Rachel编辑 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导语】北大、哈工大和加州大学圣巴巴拉分校在 ACL 2019 的一篇论文中联合提出了一个全新的生成性解释框架&#xff0c;该框架能够对分类策…

android中常见的内存泄漏和解决的方法

android中的内存溢出预计大多数人在写代码的时候都出现过&#xff0c;事实上突然认为工作一年和工作三年的差别是什么呢。事实上干的工作或许都一样&#xff0c;产品汪看到的结果也都一样&#xff0c;那差别就是速度和质量了。 写在前面的一点儿想法&#xff1a;工作做完了事实…

机器人视觉的九大挑战

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文转自&#xff1a;新机器视觉机器人视觉解决方案是我们实现机器人视野的几大挑战。即便变得越来越简单易用&#xff0c;还是有一些棘手的问题。很多因素影响机器人在环…

android dslr控制软件,DSLR Controller

DSLR Controller中文名字是单反控制器&#xff0c;是一款专业的单反手机控制端软件&#xff0c;用户可以使用该手机软件控制单反&#xff0c;调节单反的相关数据&#xff0c;控制拍摄&#xff0c;非常方便&#xff0c;需要的可以下载使用&#xff01;软件简介DSLR Controller是…

BFS之三(单向bfs和康托压缩)

//poj 1077 Eight#include <iostream> //单向bfs和康托压缩#include<string>using namespace std;bool visited[1000000];int fac[]{1,1,2,6,24,120,720,5040,40320,362880}; //9!表int cantor(int arr[]) {int temp,num1; //当排列为…

Python实现环形链表详解

这篇文章主要为大家详细介绍了Python实现环形链表&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Python实现环形链表的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 我们将…