<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>笔记 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E7%AC%94%E8%AE%B0/</link><description>Recent content in 笔记 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 11 Dec 2019 10:21:36 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml"/><item><title>MongoDB笔记</title><link>https://pangyd.com/post/227-mongodb/</link><pubDate>Sat, 09 Nov 2019 11:19:19 +0800</pubDate><guid>https://pangyd.com/post/227-mongodb/</guid><description>&lt;p>&lt;b>&lt;i>MongoDB简介&lt;/i>&lt;/b>&lt;/p>&lt;p>&lt;b>MongoDB介绍&lt;/b>&lt;/p>&lt;pre data-anchor-id="8t84">&lt;code class="hljs less">&lt;span class="hljs-selector-tag">MongoDB&lt;/span>是面向文档的非关系型数据库，不是现在使用最普遍的关系型数据库，其放弃关系模型的原因就是为了获得更加方便的扩展、稳定容错等特性。面向文档的基本思路就是：将关系模型中的“行”的概念换成“文档（&lt;span class="hljs-selector-tag">document&lt;/span>）”模型。面向文档的模型可以将文档和数组内嵌到文档中。因此，实际中可以用一条数据表示非常复杂的结构。
&lt;span class="hljs-selector-tag">MongoDB&lt;/span>没有预定义模式：文档的键(key)和值(value)不再是固定的类型和大小，而且根据需求要添加或者删除字段变得更容易了。由于没有模式需要更改，通常不需要迁移大量数据。不必将所有数据都放到一个模子里面，应用层可以处理新增或丢失的键。这样开发者可以非常容易地变更数据模型。
实际应用中，随着数据量的增大，数据库都要进行扩展。扩展有纵向扩展和横向扩展。纵向扩展是使用计算能力更强的机器，也是最省力的方法，但是很容易达到物理极限，无论花多少钱也买不到最新的机器了。横向扩展就是通过分区将数据分散到更多的机器上。&lt;span class="hljs-selector-tag">MongoDB&lt;/span>的设计采用横向扩展。面向文档的数据模型使它很容易地在多台服务器之间进行数据分割。还可以自动处理跨集群的数据和负载，自动重新分配文档，以及将用户请求路由到正确的机器上。开发者根本不用考虑数据库层次的扩展问题，需要扩展数据库时，在集群中添加机器即可，&lt;span class="hljs-selector-tag">MongoDB&lt;/span>会自动处理后续的事情。
&lt;span class="hljs-selector-tag">MongoDB&lt;/span>有如上各种特性，但为了达到这些，他也放弃了关系型数据库的某些功能如表连接&lt;span class="hljs-selector-tag">join&lt;/span>和复杂的多行事务。&lt;/code>&lt;/pre>&lt;p>&lt;b>MongoDB的优势与劣势&lt;/b>&lt;/p>&lt;p>优势&lt;/p>&lt;p>快速！基于内存，将热数据存放在物理内存中（不仅仅只是索引和少部分数据），从而提高了整体速度和效率。&lt;/p>&lt;p>高扩展性！MongoDB的高可用和集群架构拥有十分高的扩展性。&lt;/p>&lt;p>自身的FailOver机制！在副本集中，当主库遇到问题，无法继续提供服务的时候，副本集将选举一个新的主库继续提供服务。&lt;/p>&lt;p>JSon格式的数据！MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。&lt;/p>&lt;div class="md-section-divider">&amp;nbsp;&lt;/div>&lt;p>劣势&lt;/p>&lt;p>应用经验少！由于NoSQL兴起时间短，应用经验相比关系型数据库较少。&lt;/p>&lt;p>由于以往用到的都是关系型数据库，可能会造成使用者一开始的不适应。&lt;/p>&lt;p>无事务机制！MongoDB本身没有自带事务机制，若需要在MongoDB中实现事务机制，需通过一个额外的表，从逻辑上自行实现事务。&lt;/p>&lt;p>&lt;b>MongoDB基础知识与CRUD&lt;/b>&lt;/p>&lt;p data-anchor-id="ejso">1.文档(document):相当于传统关系型数据库的“行”，但比传统行表示的信息更加复杂。例如：&lt;br>&lt;/p>&lt;p data-anchor-id="ejso">&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">{"name":"jack","age":18,"sex":"male"}
&lt;/pre>&lt;br>&lt;p>&lt;/p>&lt;div class="md-section-divider">&lt;div class="cnblogs_Highlighter sh-gutter">&lt;/div>&lt;/div>&lt;p data-anchor-id="pz0y">2.集合(collection):这个在MongoDB中代表一组文档，类似于关系型数据库中的表。但在MongoDB中的表（就是集合）是没有模式的，你可以将完全不同的文档放入同一个集合中.但在实际使用中，为特定集合隐性规定一种模式。注：当集合里没有任何文档时集合其实也是不存在的。当第一个文档插入时，集合就会被创建。&amp;nbsp;&lt;br>3.数据库(database):在MongoDB中，一组集合可以组成一个数据库。一个MongoDB实例可以承载多个数据库。每个数据库都有独立的权限控制。在实际应用中，通常，一个应用的所有数据放置在一个数据库中。&amp;nbsp;&lt;br>4.数据类型：MongoDB中的文档类似于JSON。JSON是一种简单的数据交换格式，在数据类型方面，只支持：null，布尔，数字，字符串，数组和对象。这几种类型在某些实际应用中表现力还是不够，比如JSON本身不直接支持日期类型，对于数字，JSON本身也没法区分整数和浮点数，更不能区分32位数字和64位数字。为此，MongoDB再保留了JSON的各类特性外，又为其添加了一些数据类型。&amp;nbsp;&lt;br>1.null：用于表示空值或不存在的字段。Shell中这样表示：&lt;code>{"x"：null}&lt;/code>&amp;nbsp;&lt;br>2.布尔：有两个值，true和false。Shell中这样使用：&lt;code>{"x"：true}&lt;/code>&amp;nbsp;&lt;br>3.数字：Shell中数字均为64位浮点数，如在Shell中&lt;code>{"x"：3.14}&lt;/code>和&lt;code>{"x"：3}&lt;/code>这两个文档中的值均是64位的浮点数。&amp;nbsp;&lt;br>4.字符串：这个用的最广，Shell中这样表示：&lt;code>{"x"："hello world！"}&lt;/code>&amp;nbsp;&lt;br>5.日期：这个在数据存储时，存储的是从标准纪元开始的毫秒数，没有存储时区信息。&amp;nbsp;&lt;br>6.正则表达式：文档中可以包含正则表达式，采用JavaScript的正则表达式语法即可，Shell中这样表示：&lt;code>{"x"：/foobar/i}&lt;/code>。&lt;br>7.数组：数组是一组值，既可以表示为有序对象（列表，栈，队列等）也可以表示无序对象（集合），Shell中这样表示一个数组：&lt;code>{"things"：["pie"，3.14]}&lt;/code>。&amp;nbsp;&lt;br>8.内嵌文档：把一个文档整个作为另一个文档某一个键对应的值。&amp;nbsp;&lt;br>其他包括二进制数据，代码等。&lt;/p>&lt;h3 id="mongodb入门shell基本操作" data-anchor-id="60is">MongoDB入门(Shell基本操作)&lt;/h3>&lt;p>&lt;span>shell是一个功能完备的JavaScript解释器，可运行任意的JavaScript程序。这里不做示例。&amp;nbsp;&lt;/span>&lt;br>&lt;span>MongoDB的默认数据库为"db"，该数据库存储在data目录中。&amp;nbsp;&lt;/span>&lt;br>&lt;span>1.选择数据库&lt;/span>&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#选择名test数据库
use tset&lt;/pre>&lt;p>&lt;span>如果忘记了数据库名称可以输入如下代码查询所有数据库名称："show dbs" 命令可以显示所有数据的列表&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">show dbs&lt;/pre>&lt;p data-anchor-id="5h1c">查看数据库中的集合名：&lt;/p>&lt;div>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">show collections&lt;/pre>&lt;p>&lt;span>下表列出了 RDBMS 与 MongoDB 对应的术语：&amp;nbsp;&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;img src="https://pangyd.com/uploads/2019/05/ebe16666a468bd09.png" alt="2017-05-17_170031.png">&lt;br>&lt;/span>&lt;/p>&lt;h3 id="插入文档" data-anchor-id="3jei">插入文档&lt;/h3>&lt;/div>&lt;p>&lt;/p>&lt;p data-anchor-id="hbt8">insert函数可将一个文档插入到集合中去。以一个博客举例。先创建一个叫post的变量(JavaScript对象)有三个键和对应的属性。插入代码：&lt;/p>&lt;p data-anchor-id="hbt8">&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">db.blog.insert(post)&lt;/pre>&lt;p>&lt;span>批量插入&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">db.blog.insertMany([{"_id":0},{"_id":1},{"_id":2}])&lt;/pre>&lt;h3 id="查询文档" data-anchor-id="6u2w">查询文档&lt;/h3>&lt;p>&lt;/p>&lt;p data-anchor-id="p2pt">查询代码如下：&lt;/p>&lt;p data-anchor-id="p2pt">&lt;/p>&lt;pre lay-lang="JavaScript" class="layui-code" skin="notepad">db.blog.find()&lt;/pre>&lt;p>&lt;span>多出来的"_id"就是MongoDB自动创建的默认为ObjectID类型的对象。在一个集合里，每个文档都由唯一的"_id",确保集合中的每个文档都能被唯一标识，它采用12字节的存储空间，由24个16进制数字组成。&lt;/span>&lt;/p>&lt;p>&lt;span>如果插入文档时没有"_id"键，系统会为我们自动创建一个。&amp;nbsp;&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;span>若只想查看一个文档，可以用findOne：&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;/span>&lt;/p></description></item></channel></rss>