蓉城老沈 發表於 2020-11-4 09:08:00

我叫MongoDb,不懂我的看完我的故事您就入门啦!

<p align="center"><strong><img src="https://img2020.cnblogs.com/blog/381957/202011/381957-20201104090043461-38683433.png" alt="" loading="lazy"></strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="center"><strong>这是mongo基础篇,后续会连续更新4篇</strong></p>
<p>大家好我叫MongoDb,自从07年10月10gen团队把我带到这个世界来,我已经13岁多啦,现在越来越多的小伙伴在拥抱我,我很高兴。我是NoSQL大家族的一员,我是C++的亲儿子啦。为了大家更好的熟悉我,今天我先简单从简单的使用角度来介绍我自己。</p>
<p><strong>首先还是先介绍一下我们的大家族NoSQL吧</strong></p>
<p>NoSQL只是他简称,他的中文名叫 非关系型数据库,外文名叫Not Only SQL。他是对关系型数据库的一个补充(RDBMS)。RDBMS追求数据存储和查询的高度结构化、严格的数据一致性;NOSQL不在乎形式,重点关心效率,NOSQL是高性能、无模式、高可扩展的分布式数据库,NOSQL存储包括四种类型:键值对存储、列存储、文档存储、图形数据存储。NoSQL就简单介绍到这,这不是今天的重点,下面还是重点介绍一下我自己(MongoDb),呵呵!</p>
<p><strong>MongoDb</strong><strong>自我介绍</strong></p>
<p>MongoDb是一个面向文档存储的键值对NOSQL数据库,是一个最接近关系型数据库的非关系数据库。在数据存储结构和查询上使用BJOSN(类似于JSON)结构,BJOSN支持多层机构,在具体的使用过程中,更像是操作Javascript脚本。正因为MongoDb的无模式化,在实际应用中变得更加灵活,易于扩展。与RDBMS一样,支持主键、索引、检索等操作,由于非结构化所以不支持join查询。</p>
<p><strong>MongoDb</strong><strong>的基本概念</strong></p>
<p>具体的数据库安装就不在介绍了,网上一搜一大推。MongoDb采用BJON化的文档存储,所以其基本结构概念可以结合JSON联想一下:字段、文档、集合、数据库,这和RDBMS的属性、列、表、数据库是一一对应关系。下面以一个表格来对比说明一下:</p>
<p>&nbsp;</p>
<div align="center">
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="158">
<p align="center"><strong>RDBMS</strong></p>
</td>
<td colspan="2" valign="top" width="321">
<p align="center"><strong>MongoDb</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="78">
<p><strong>概念</strong></p>
</td>
<td valign="top" width="81">
<p><strong>说明</strong></p>
</td>
<td valign="top" width="95">
<p><strong>概念</strong></p>
</td>
<td valign="top" width="227">
<p><strong>说明</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="78">
<p>database</p>
</td>
<td valign="top" width="81">
<p>数据库</p>
</td>
<td valign="top" width="95">
<p>database</p>
</td>
<td valign="top" width="227">
<p>数据库</p>
</td>
</tr>
<tr>
<td valign="top" width="78">
<p>table</p>
</td>
<td valign="top" width="81">
<p>表</p>
</td>
<td valign="top" width="95">
<p>collection</p>
</td>
<td valign="top" width="227">
<p>集合</p>
</td>
</tr>
<tr>
<td valign="top" width="78">
<p>row</p>
</td>
<td valign="top" width="81">
<p>行</p>
</td>
<td valign="top" width="95">
<p>document</p>
</td>
<td valign="top" width="227">
<p>文档:对应的一个BJSON</p>
</td>
</tr>
<tr>
<td valign="top" width="78">
<p>column</p>
</td>
<td valign="top" width="81">
<p>列</p>
</td>
<td valign="top" width="95">
<p>field</p>
</td>
<td valign="top" width="227">
<p>字段:BJSON中的具体某一个字段</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<p>简单的一个表格显示还不够直观,那我们在来一张形象的图片来说明一下吧!</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/381957/202011/381957-20201104090053893-273866327.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/381957/202011/381957-20201104090059934-266563842.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;</p>
<p><strong>用户权限管理</strong></p>
<p>在生成环境数据库管理中,数据库权限是一个很重要的功能。在具体的权限上,需要针对全局的权限控制,需要精确到具体的数据的权限,在具体的权限分类上包括:读、读写、管理员等权限。下面列表介绍mongodb的内置权限:</p>
<table style="width: 574px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="158">
<p align="center"><strong>权限名称</strong></p>
</td>
<td valign="top" width="416">
<p align="center"><strong>权限说明</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>read</p>
</td>
<td valign="top" width="416">
<p>允许用户读取指定数据库</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>readWrite</p>
</td>
<td valign="top" width="416">
<p>允许用户读写指定数据库</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>dbAdmin</p>
</td>
<td valign="top" width="416">
<p>允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>userAdmin</p>
</td>
<td valign="top" width="416">
<p>允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>clusterAdmin</p>
</td>
<td valign="top" width="416">
<p>只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>readAnyDatabase</p>
</td>
<td valign="top" width="416">
<p>只在admin数据库中可用,赋予用户所有数据库的读权限</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>readWriteAnyDatabase</p>
</td>
<td valign="top" width="416">
<p>只在admin数据库中可用,赋予用户所有数据库的读写权限</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>userAdminAnyDatabase</p>
</td>
<td valign="top" width="416">
<p>只在admin数据库中可用,赋予用户所有数据库的userAdmin权限</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>dbAdminAnyDatabase</p>
</td>
<td valign="top" width="416">
<p>只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。</p>
</td>
</tr>
<tr>
<td valign="top" width="158">
<p>root</p>
</td>
<td valign="top" width="416">
<p>只在admin数据库中可用。超级账号,超级权限</p>
</td>
</tr>
</tbody>
</table>
<p>通过上面的表,我们可以得出:根据权限的作用范围上来看,权限分为了两大类权限:针对每一库的权限、针对全部数据库的权限。根据不同的权限分类,在赋值格式上也有一定差异,在具体的用户权限分配上,一个用户可以同时分配多个权限。</p>
<p>新增用户时权限初始化格式为:</p>
<p>针对全部数据库权限初始化命令格式:</p>
<p>db.createUser({user:"用户名",pwd:"密码",roles:["权限值"]})</p>
<p>针对指定数据库权限初始化命令格式:</p>
<p>db.createUser({user:"用户名",pwd:"密码",roles:[ {role:"权限值",db:"对应的数据库"},{role:"权限值",db:"对应的数据库"}….]})</p>
<p>这样说可能不怎么好理解,那么我们还是以实际工作的使用情况来举例说明。</p>
<p>条件假设:有3个数据库:testdb001、testdb002</p>
<p>需要给如用户分配对应的权限</p>
<table style="width: 662px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="85">
<p align="center"><strong>用户</strong></p>
</td>
<td valign="top" width="161">
<p align="center"><strong>需要分配的权限</strong></p>
</td>
<td valign="top" width="416">
<p align="center"><strong>具体的命令</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="85">
<p>adminRoot</p>
</td>
<td valign="top" width="161">
<p>超级账号,具有所有数据库的全部操作权限</p>
</td>
<td valign="top" width="416">
<p align="left">use admin</p>
<p align="left">db.createUser({user:"adminRoot",pwd:"123",roles:["root"]})</p>
</td>
</tr>
<tr>
<td valign="top" width="85">
<p>adminWrite</p>
</td>
<td valign="top" width="161">
<p>超级写账号,具有所有数据库的读写操作权限</p>
</td>
<td valign="top" width="416">
<p align="left">use admin</p>
<p align="left">db.createUser({user:"adminWrite",pwd:"123",roles:["readWriteAnyDatabase"]})</p>
</td>
</tr>
<tr>
<td valign="top" width="85">
<p>adminRead</p>
</td>
<td valign="top" width="161">
<p>超级写账号,具有所有数据库的读操作权限</p>
</td>
<td valign="top" width="416">
<p align="left">use admin</p>
<p align="left">db.createUser({user:"adminRead",pwd:"123",roles:["readAnyDatabase"]})</p>
</td>
</tr>
<tr>
<td valign="top" width="85">
<p>001Write</p>
</td>
<td valign="top" width="161">
<p>具有数据库testdb001的读写操作权限</p>
</td>
<td valign="top" width="416">
<p align="left">use admin</p>
<p align="left">db.createUser({user:"001Write",pwd:"123",roles:[ {role:"readWrite",db:" testdb001"}]})</p>
</td>
</tr>
<tr>
<td valign="top" width="85">
<p>001Read</p>
</td>
<td valign="top" width="161">
<p>具有数据库testdb001的读操作权限</p>
</td>
<td valign="top" width="416">
<p align="left">use admin</p>
<p align="left">db.createUser({user:"001Read",pwd:"123",roles:[ {role:"read",db:" testdb001"}]})</p>
</td>
</tr>
<tr>
<td valign="top" width="85">
<p>012Write</p>
</td>
<td valign="top" width="161">
<p>具有数据库testdb001、testdb002的读写操作权限</p>
</td>
<td valign="top" width="416">
<p align="left">use admin</p>
<p align="left">db.createUser({user:"001Write",pwd:"123",roles:[ {role:"readWrite",db:" testdb001"},{role:"readWrite",db:" testdb002"}]})</p>
</td>
</tr>
</tbody>
</table>
<p>通过实际举例,应该对权限的新增初始化操作命令有了理解,那么下面我们就来对权限的根据新操作命令简单聊聊,其实根系和初始化具体的权限格式是一至的,具体如下:</p>
<p>针对全部数据库权限更新命令格式:</p>
<p>db.updateUser("被更新用户名",{pwd:"更新后的密码",roles:["权限值"]})</p>
<p>针对指定数据库权限更新命令格式:</p>
<p>db.updateUser("被更新用户名",{pwd:"更新后的密码",roles:[{role:"权限值",db:"对应的数据库"},{role:"权限值",db:"对应的数据库"}….]})</p>
<p>注意:updateUser的第二个参数有两个节点:pwd和roles。如果不需要更新某一节点的数据,那么直接不要该节点即可。</p>
<p>实例:继续上面的实例继续操作</p>
<table style="width: 567px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="236">
<p align="center"><strong>用户更新述求</strong></p>
</td>
<td valign="top" width="331">
<p align="center"><strong>具体的命令</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="236">
<p>更新用户adminRoot的密码为111111</p>
</td>
<td valign="top" width="331">
<p align="left">use admin</p>
<p align="left">db.updateUser("adminRoot",{pwd:"111111"})</p>
</td>
</tr>
<tr>
<td valign="top" width="236">
<p>更新001Write的同时具有testdb001和testdb002的写权限</p>
</td>
<td valign="top" width="331">
<p align="left">use admin</p>
<p align="left">db.updateUser("adminWrite",{roles:[ {role:"readWrite",db:" testdb001"},{role:"readWrite",db:" testdb002"}]})</p>
</td>
</tr>
<tr>
<td valign="top" width="236">
<p>更新001Read的同时具有testdb001和testdb002的读权限,并且密码也更新为111111</p>
</td>
<td valign="top" width="331">
<p align="left">use admin</p>
<p align="left">db.updateUser("001Read",{ pwd:"111111",roles:[ {role:"read",db:" testdb001"},{role:"read",db:" testdb002"}]})</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>数据库(database)</strong></p>
<p>具体的数据库概念和RDBMS一致,一个mongodb可以创建多个数据库,不同数据库也可以存储在不同的mongodb。系统的默认数据库包括:admin(存储用户权限相关)、config(配置信息)、local(日志信息)。针对数据库我们常用的操作包括:创建、删除。具体的实现如下:</p>
<p>创建:use 数据库名称</p>
<p>当数据库名称不存在时,系统自动创建(创建后不能显示,需要向里面插入数据才会显示),存在则切换。</p>
<p>删除:首先要切换到对于的数据库,然后在执行dropDatabase命令</p>
<p>use 被删除的数据库名称</p>
<p>db.dropDatabase()</p>
<p>&nbsp;</p>
<p><strong>集合(Collection)</strong></p>
<p>集合是mongodb中对数据存储的一个分组,和关系数据库中的表是对应关系。集合中存储的文档数据的无固定格式,可以自由存储不同格式的bjson数据,但是在实际使用中,我们还是存储同一类型的bjson数据。集合的常见的操作命令如下:</p>
<p>创建集合:</p>
<p>db.createCollection(集合名称,集合规则),其中第二次参数为一个json数据,非必填,具体的参数节点为:</p>
<p>集合规则:{ capped :选填bool类型:设置改集合是否为一个固定集合,</p>
<p>true:代表固定集合,集合中的数据不可修改,与size配对使用,代表当集合达到指定大小后,会自动覆盖历史数据(最先添加的数据),</p>
<p>size:选填数字类型:指定集合的最大存储数据(字节数),当集合达到指定大小后,会自动覆盖历史数据(最先添加的数据) }</p>
<p>max: 选填数字类型:指定集合的最大存储的文档总个数,当文档个数大于max值时,会自动替换历史文档</p>
<p>}</p>
<p>collection删除:</p>
<p>db.集合名称.drop();</p>
<p><strong>&nbsp;</strong></p>
<p><strong>文档(Document)</strong></p>
<p>文档就一组键值(key-value)对数据(一个BJON),具体的一个文档结构可以多层嵌套,不同文档间的数据结构可以不一样,并且相同节点的数据类型也可不一样,这是与RDBMS最大的区别所在,这也奠定了MongoDB的高可扩展性。其实简单的说就是一个一个的jon格式的数据。</p>
<p>文档常见的几个操作命令汇总:</p>
<table style="width: 603px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="83">
<p align="center"><strong>操作</strong></p>
</td>
<td valign="top" width="520">
<p align="center"><strong>命令格式</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="83">
<p>插入数据</p>
</td>
<td valign="top" width="520">
<p>db.集合名称.insert(json对象)&nbsp; json可以是单个数据,也可以是一个集合列表</p>
</td>
</tr>
<tr>
<td valign="top" width="83">
<p>更新数据</p>
</td>
<td valign="top" width="520">
<p align="left">db. 集合名称.update(query&nbsp;, update,option)</p>
<p align="left">query&nbsp;:被更新文档条件json</p>
<p align="left">update:更新后的文档json</p>
<p align="left">option:更新方式json,参数格式为{ upsert: boolean, multi : boolean }</p>
<p align="left">upsert:非必填参数,如果不存在是否新增,当值为true时,如果没有符合条件的数据,就插入数据, ,默认为false</p>
<p align="left">multi: 非必填参数,是否更新符合要求的所有数据,当值为true时,符合条件的数据全部更新,默认为false</p>
</td>
</tr>
<tr>
<td valign="top" width="83">
<p>删除数据</p>
</td>
<td valign="top" width="520">
<p>db.集合名称.remove(query&nbsp;, justOne&nbsp;)</p>
<p align="left">query&nbsp;:(可选)删除的文档的条件。</p>
<p align="left">justOne&nbsp;: (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。</p>
</td>
</tr>
<tr>
<td valign="top" width="83">
<p>查询数据</p>
</td>
<td valign="top" width="520">
<p>db.集合名称.find(jison对象查询条件)</p>
</td>
</tr>
</tbody>
</table>
<p><strong>&nbsp;</strong></p>
<p><strong>字段</strong></p>
<p>字段就很好理解了,就是文档中的json数据的每一个节点。</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/381957/202011/381957-20201104090126358-1547006181.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>通过对mongodb的操作简单介绍,其实我们不难发现以下一些特性:</p>
<p>1.无论是对文档的增、删、改、查操作的参数一切皆json,在实际操作的时候,按照json方式来操作即可。</p>
<p>2.数据库和集合都可以在使用是自动创建:</p>
<p>2.1 use 切换数据库时,如果没有数据库自动创建;</p>
<p>2.2 db.集合.insert() 当集合不存在时,系统自动创建集合。</p>
<p>Mongodb的这一些特性用起来是不是很爽的感觉。下面从数据库的创建,到文档的整体操作流程写一些演示实例,来加深印象。</p>
<table style="width: 603px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="140">
<p align="center"><strong>操作</strong></p>
</td>
<td valign="top" width="463">
<p align="center"><strong>命令格式</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>连接到mongdb</p>
</td>
<td valign="top" width="463">
<p>mongo</p>
<p>use admin</p>
<p>db.auth("用户名","用户密码")</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">创建数据库 bd001和表user001</p>
</td>
<td valign="top" width="463">
<p align="left">use bd001</p>
<p align="left">db.createCollection("user001")</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">创建数据库 bd002和user002</p>
</td>
<td valign="top" width="463">
<p align="left">use bd002</p>
<p align="left">db.createCollection("user002")</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>查看所有数据库</p>
</td>
<td valign="top" width="463">
<p>show dbs</p>
<p>输出结果</p>
<p>admin&nbsp;&nbsp; 0.000GB</p>
<p>config&nbsp; 0.000GB</p>
<p>local&nbsp;&nbsp; 0.000GB</p>
<p>bd001&nbsp; 0.000GB</p>
<p>bd002&nbsp; 0.000GB</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>删除集合user002</p>
</td>
<td valign="top" width="463">
<p>use db002</p>
<p>db.user002.drop()</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>删除数据库db002</p>
</td>
<td valign="top" width="463">
<p>use db002</p>
<p>db. dropDatabase()</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>向表user001插入一条数据</p>
</td>
<td valign="top" width="463">
<p>use db001</p>
<p>db.user001.insert({name:”程序员修炼之旅”,age:2})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>向表user001插入两条数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.insert([</p>
<p align="left">{name:"mongodb",age:12,type:"database"},</p>
<p align="left">{"name":".net",from:"U.S.A"}</p>
<p align="left">])</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>向表user001插入三条数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.insert([</p>
<p align="left">{name:"zhangsan",age:12,sex:"man"},</p>
<p align="left">{name:"zhangsan",age:18,sex:"woman"},</p>
<p align="left">{name:"zhangsan",age:22,sex:"man"}</p>
<p align="left">])</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>查询一下表中的数据情况</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find()</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序员修炼之旅", "age" : 2 }</p>
<p align="left">{ "_id" : ObjectId("5fa0abb495368a0bf20f38d0"), "name" : ".net", "from" : "U.S.A" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d1"), "name" : "zhangsan", "age" : 12, "sex" : "man" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 18, "sex" : "woman" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 22, "sex" : "man" }</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>查询表中name="程序员修炼之旅"的数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name: "程序员修炼之旅"})</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序员修炼之旅", "age" : 2 }</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>修改表中name="程序员修炼之旅"的数据的age=66,并新增一个节点from节点</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.update({name: "程序员修炼之旅"},{$set:{age:66,from: "CDU"}})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>查看修改后的数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name: "程序员修炼之旅"})</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0ab4195368a0bf20f38cd"), "name" : "程序员修炼之旅", "age" : 66,from: "CDU"}</p>
<p align="left">数据已经是修改后的数据了</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>修改表中name=" zhangsan"的数据的age=88,并且只修改一条符合要求的数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.update({name: "zhangsan"},{$set:{age:88}},{ multi:false})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">查看name=" zhangsan"修改后的数据,是否只有一条数据的age被修改为88?</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name: "zhangsan"})</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d1"), "name" : "zhangsan", "age" : 88, "sex" : "man" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 18, "sex" : "woman" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 22, "sex" : "man" }</p>
<p align="left">只有第一条的age被修改为了88</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p>修改表中name=" zhangsan"的数据的age=99,修改符合要求的所有数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.update({name: "zhangsan"},{$set:{age:99}},{ multi:true})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">查看name=" zhangsan"修改后的数据,是否只所有数据的age被修改为99?</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name: "zhangsan"})</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d1"), "name" : "zhangsan", "age" : 99, "sex" : "man" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 99, "sex" : "woman" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 99, "sex" : "man" }</p>
<p align="left">name="zhangsan"的所有数据age被修改为了99</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">修改name="lisi"的age=77</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.update({name: "lisi"},{$set:{age:77}})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">查看数据修改结果</p>
<p align="left">由于没有name=lisi的数据,所有查询不到数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name: "lisi"})</p>
<p align="left">查询结果:</p>
<p align="left">无数据</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">修改name="lisi"的age=77,如果没有则新增</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.update({name: "lisi"},{$set:{age:77}},{ upsert:true})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">查看数据修改结果</p>
<p align="left">新增了一条name="lisi"的数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name: "lisi"})</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0b3731b875939723ffe26"), "name" : "lisi", "age" : 77 }</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">删除一条name="zhangsan"的数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.rmove({name: "zhangsan"},1)</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">查看删除结果</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name:"zhangsan"})</p>
<p align="left">查询结果:</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d2"), "name" : "zhangsan", "age" : 18, "sex" : "woman" }</p>
<p align="left">{ "_id" : ObjectId("5fa0ad3b95368a0bf20f38d3"), "name" : "zhangsan", "age" : 22, "sex" : "man" }</p>
<p align="left">name="zhangsan"的数据数据由原来的3条变为了2条,被删除了一条</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">删除所有name="zhangsan"的数据</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.rmove({name: "zhangsan"})</p>
</td>
</tr>
<tr>
<td valign="top" width="140">
<p align="left">查看删除结果</p>
</td>
<td valign="top" width="463">
<p align="left">use db001</p>
<p align="left">db.user001.find({name:"zhangsan"})</p>
<p align="left">查询结果:</p>
<p align="left">无数据</p>
<p align="left">name="zhangsan"的数据数据被全部删除了</p>
</td>
</tr>
</tbody>
</table>
<p>通过上面的实际操作,我们发现所有新增文档都会自动生成一个节点”_id”( ObjectId),该_id是mongodb系统自动生成的类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:</p>
<p><img src="https://img2020.cnblogs.com/blog/381957/202011/381957-20201104090150594-1235350201.png" alt="" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1.前 4 个字节表示创建&nbsp;<strong>unix</strong>&nbsp;时间戳,格林尼治时间&nbsp;<strong>UTC</strong>&nbsp;时间,比北京时间晚了 8 个小时</p>
<p>2.接下来的 3 个字节是机器标识码</p>
<p>3.紧接的两个字节由进程 id 组成 PID</p>
<p>4.最后三个字节是随机数</p>
<p>当然_id也可以根据实际需要自定义赋值。</p>
<p>好了今天就先写到这,通过本篇文章对mongo有了一个初步的认识了解,下一篇文章,我们在一起详聊查询,mongo的查询还是有很多聊的。谢谢您的查看。</p>
<p align="left">&nbsp;</p>
<p>END<br>为了更高的交流,欢迎大家关注我的公众号,扫描下面二维码即可关注,谢谢:</p>
<p><img src="https://img2020.cnblogs.com/blog/381957/202006/381957-20200609102247158-1709176751.jpg" alt="" width="258" height="258" loading="lazy"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xiaoXuZhi/p/xyh_mongodb_base.html
頁: [1]
查看完整版本: 我叫MongoDb,不懂我的看完我的故事您就入门啦!