MongoDB从入门到实战之MongoDB工作常用操作命令
<h2>前言</h2><p>上一章节我们快速的在Docker容器中安装了MongoDB,并且通过Navicat MongoDB可视化管理工具快速的连接、创建数据库、集合以及添加了文档数据源。这一章节我们主要是了解一下在日常工作中MongoDB一些常用的操作命令。</p>
<h2>MongoDB从入门到实战的相关教程</h2>
<p>MongoDB从入门到实战之MongoDB简介👉</p>
<p>MongoDB从入门到实战之MongoDB快速入门👉</p>
<p>MongoDB从入门到实战之Docker快速安装MongoDB👉</p>
<p>MongoDB从入门到实战之MongoDB工作常用操作命令👉</p>
<h2>YyFlight.ToDoList项目源码地址</h2>
<blockquote>
<p>GitHub地址:https://github.com/YSGStudyHards/YyFlight.ToDoList</p>
</blockquote>
<h2>进入创建的MongoDB容器</h2>
<div class="cnblogs_code">
<pre>docker ps-- 查看MongoDB容器<br>docker exec -it mongo-test mongosh -- 进入MondoDB容器中</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202210/1336199-20221029225638869-1292588428.png" alt="" loading="lazy"></p>
<h2>数据库常用命令</h2>
<h3>Help指令帮助</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">help #命令提示符
db.help() #数据库方法帮助信息
db.mycoll.help() #集合方法帮助信息</span></pre>
</div>
<h3>切换/创建数据库</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">#假如已经存在的数据库会直接切换到指定的数据库
use testDb
#当创建一个新的数据库需要创建一个集合(table)的时候才会把数据库持久化到磁盘中
【可能一开始创建数据库时,是在内存中的,还没有持久化到磁盘。新建集合时,就持久化了】
use testDb
db.createCollection(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mybooks</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<h3>数据库查看</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">show dbs #查看所有数据库
db 或 db.getName() #</span>查看当前使用的数据库</pre>
</div>
<h3>显示当前db状态</h3>
<div class="cnblogs_code">
<pre>db.stats()</pre>
</div>
<h3>查看当前db版本</h3>
<div class="cnblogs_code">
<pre>db.version()</pre>
</div>
<h3>查看当前db的连接服务器机器地址</h3>
<div class="cnblogs_code">
<pre>db.getMongo()</pre>
</div>
<h3>删除当前使用数据库</h3>
<div class="cnblogs_code">
<pre>db.dropDatabase()</pre>
</div>
<h3>查询之前的错误信息和清除</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.getPrevError()
db.resetError()</span></pre>
</div>
<h2>Collection集合创建、查看、删除</h2>
<h3>集合创建</h3>
<div class="cnblogs_code">
<pre>db.createCollection("MyBooks")#MyBooks集合名称</pre>
</div>
<h3>查看当前数据库中的所有集合</h3>
<div class="cnblogs_code">
<pre>show collections</pre>
</div>
<h3>集合删除</h3>
<div class="cnblogs_code">
<pre>db.MyBooks.drop() #MyBooks要删除的集合名称</pre>
</div>
<h2>Document文档增删改查</h2>
<h3>文档插入</h3>
<p><strong>insert多个文档插入</strong></p>
<p>MongoDB使用insert() 方法向集合中插入一个或多个文档,语法如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.COLLECTION_NAME.insert(document)<br></span></pre>
</div>
<blockquote>
<p>注意:insert(): 若插入的数据主键已经存在,则会抛 <strong>org.springframework.dao.DuplicateKeyException</strong> 异常,提示主键重复,不保存当前数据。</p>
</blockquote>
<p><strong>示例:</strong></p>
<p>添加数据源:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">[{
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">追逐时光者</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">15012454678</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}, {
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">王亚</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">18687654321</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}, {
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">大姚</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">13100001111</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}, {
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小袁</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">131054545541</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}]</span></pre>
</div>
<p>多条文档数据插入:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.Contacts.insert([{
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">追逐时光者</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">15012454678</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}, {
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">王亚</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">18687654321</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}, {
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">大姚</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">13100001111</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}, {
name: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小袁</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
phone: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">131054545541</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}])</span></pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105232056567-2075915765.png" alt="" loading="lazy"></p>
<p>查看插入文档数据:</p>
<div class="cnblogs_code">
<pre>db.Contacts.find()</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105232220854-354116730.png" alt="" loading="lazy"></p>
<p><strong>insertOne一个文档插入</strong></p>
<p>insert() 方法可以同时插入多个文档,但如果您只需要将一个文档插入到集合中的话,可以使用 insertOne() 方法,该方法的语法格式如下:</p>
<div class="cnblogs_code">
<pre>db.COLLECTION_NAME.insertOne(document)</pre>
</div>
<p>示例:</p>
<p>添加数据源:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
bookName: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">平凡的世界</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
author: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">路遥</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>添加示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.MyBooks.insertOne({
bookName: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">平凡的世界</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
author: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">路遥</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105232746740-1703428086.png" alt="" loading="lazy"></p>
<h3>文档更新</h3>
<p>update() 方法用于更新已存在的文档。语法格式如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.collection.update(
</span><query><span style="color: rgba(0, 0, 0, 1)">,
</span><update><span style="color: rgba(0, 0, 0, 1)">,
{
upsert: </span><boolean><span style="color: rgba(0, 0, 0, 1)">,
multi: </span><boolean><span style="color: rgba(0, 0, 0, 1)">,
writeConcern: </span><document><span style="color: rgba(0, 0, 0, 1)">
}
)</span></pre>
</div>
<p>参数说明:</p>
<ul>
<li>query : update的查询条件,类似sql update查询内where后面的。</li>
<li>update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的</li>
<li>upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。</li>
<li>multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。</li>
<li>writeConcern :可选,抛出异常的级别。</li>
</ul>
<p>示例:</p>
<p>更改bookName:"平方的世界"书籍名称改成“平方的世界”</p>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105234837192-1483096837.png" alt="" loading="lazy"></p>
<div class="cnblogs_code">
<pre>db.MyBooks.update({<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">bookName</span><span style="color: rgba(128, 0, 0, 1)">'</span>:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">平方的世界</span><span style="color: rgba(128, 0, 0, 1)">'</span>},{$<span style="color: rgba(0, 0, 255, 1)">set</span>:{<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">bookName</span><span style="color: rgba(128, 0, 0, 1)">'</span>:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">平凡的世界</span><span style="color: rgba(128, 0, 0, 1)">'</span>}})</pre>
</div>
<p>修改成功后的结果:</p>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105235214841-1927804664.png" alt="" loading="lazy"></p>
<h3>文档查询</h3>
<p>MongoDB 查询数据的语法格式如下:</p>
<div class="cnblogs_code">
<pre>db.collection.find(query, projection)</pre>
</div>
<ul>
<li><strong>query</strong> :可选,使用查询操作符指定查询条件</li>
<li><strong>projection</strong> :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。</li>
</ul>
<p>如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:</p>
<div class="cnblogs_code">
<pre>db.col.find().pretty()</pre>
</div>
<p>pretty() 方法以格式化的方式来显示所有文档。</p>
<h4><strong>查询Contacts集合中的所有数据:</strong></h4>
<div class="cnblogs_code">
<pre>db.Contacts.find().pretty()</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105235729446-193768463.png" alt="" loading="lazy"></p>
<h4>MongoDB 与 RDBMS Where 语句比较:</h4>
<p>如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:</p>
<table class="reference" style="height: 349px; width: 1089px">
<thead>
<tr><th>操作</th><th>格式</th><th>范例</th><th>RDBMS中的类似语句</th></tr>
</thead>
<tbody>
<tr>
<td>等于</td>
<td><code>{<key>:<value></code>}</td>
<td><code>db.col.find({"by":"菜鸟教程"}).pretty()</code></td>
<td><code>where by = '菜鸟教程'</code></td>
</tr>
<tr>
<td>小于</td>
<td><code>{<key>:{$lt:<value>}}</code></td>
<td><code>db.col.find({"likes":{$lt:50}}).pretty()</code></td>
<td><code>where likes < 50</code></td>
</tr>
<tr>
<td>小于或等于</td>
<td><code>{<key>:{$lte:<value>}}</code></td>
<td><code>db.col.find({"likes":{$lte:50}}).pretty()</code></td>
<td><code>where likes <= 50</code></td>
</tr>
<tr>
<td>大于</td>
<td><code>{<key>:{$gt:<value>}}</code></td>
<td><code>db.col.find({"likes":{$gt:50}}).pretty()</code></td>
<td><code>where likes > 50</code></td>
</tr>
<tr>
<td>大于或等于</td>
<td><code>{<key>:{$gte:<value>}}</code></td>
<td><code>db.col.find({"likes":{$gte:50}}).pretty()</code></td>
<td><code>where likes >= 50</code></td>
</tr>
<tr>
<td>不等于</td>
<td><code>{<key>:{$ne:<value>}}</code></td>
<td><code>db.col.find({"likes":{$ne:50}}).pretty()</code></td>
<td><code>where likes != 50</code></td>
</tr>
</tbody>
</table>
<h4>MongoDB AND 条件</h4>
<p>MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。</p>
<p>语法格式如下:</p>
<div class="cnblogs_code">
<pre>db.col.find({key1:value1, key2:value2}).pretty()</pre>
</div>
<p><strong>查询集合(Contacts)中name="小袁" 和 phone="131054545541"记录:</strong></p>
<div class="cnblogs_code">
<pre>db.Contacts.find({"name":"小袁", "phone":"131054545541"}).pretty()</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221106000935382-746774661.png" alt="" loading="lazy"></p>
<h4>MongoDB OR 条件</h4>
<p>MongoDB OR 条件语句使用了关键字 <strong>$or</strong>,语法格式如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()</span></pre>
</div>
<p><strong>查询集合(Contacts)中name="小袁" 或 <strong>name</strong>="大姚"记录:</strong></p>
<div class="cnblogs_code">
<pre>db.Contacts.find({$or:[{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小袁</span><span style="color: rgba(128, 0, 0, 1)">"</span>},{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">大姚</span><span style="color: rgba(128, 0, 0, 1)">"</span>}]}).pretty()</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221106001254901-1925480935.png" alt="" loading="lazy"></p>
<h4>AND 和 OR 联合使用</h4>
<p>以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: <strong>'where age>18 AND ("name"="小袁" OR "name"="大姚")':</strong></p>
<div class="cnblogs_code">
<pre>db.Contacts.find({<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">"</span>: {$gt:<span style="color: rgba(128, 0, 128, 1)">18</span>}, $or: [{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小袁</span><span style="color: rgba(128, 0, 0, 1)">"</span>},{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">大姚</span><span style="color: rgba(128, 0, 0, 1)">"</span>}]}).pretty()</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221106001939888-237371083.png" alt="" loading="lazy"></p>
<h3>文档删除</h3>
<p>remove() 方法的基本语法格式如下所示:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">db.collection.remove(
</span><query><span style="color: rgba(0, 0, 0, 1)">,
{
justOne: </span><boolean>, writeConcern: <document><span style="color: rgba(0, 0, 0, 1)">
}
)</span></pre>
</div>
<p>参数说明:</p>
<ul>
<li>query:必选项,是设置删除的文档的条件。</li>
<li>justOne:布尔型的可选项,默认为false,删除符合条件的所有文档,如果设为 true,则只删除一个文档。</li>
<li>writeConcem:可选项,设置抛出异常的级别。</li>
</ul>
<h4>1、根据某个_id值删除数据:</h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">#_id为字符串的话,可以直接这样
db.collection.remove({</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你的id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">});
#_id由MongoDB自己生成时
db.collection.remove({</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">'</span>:ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">636680729003374f6a6c7add</span><span style="color: rgba(128, 0, 0, 1)">"</span>)})</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221105234657478-2033307450.png" alt="" loading="lazy"></p>
<h4>2、移除 title 为“MongoDB”的文档:</h4>
<div class="cnblogs_code">
<pre>db.colection.remove({<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MongoDB</span><span style="color: rgba(128, 0, 0, 1)">'</span>})</pre>
</div>
<h2>MongoDB Limit与Skip方法</h2>
<h3>Contacts集合数据展示</h3>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122014909757-1676465697.png" alt="" loading="lazy"></p>
<h3>MongoDB Limit方法</h3>
<p>如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。</p>
<h4>语法:</h4>
<p>limit()方法基本语法如下所示:</p>
<div class="cnblogs_code">
<pre>db.COLLECTION_NAME.find().limit(NUMBER)</pre>
</div>
<h4><strong>示例:</strong></h4>
<p>查询Contacts集合中的前两条数据:</p>
<blockquote>
<p>注意:如果没有指定limit()方法中的参数则显示集合中的所有数据。</p>
</blockquote>
<div class="cnblogs_code">
<pre>db.Contacts.find().limit(<span style="color: rgba(128, 0, 128, 1)">2</span>)</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122014305476-884148667.png" alt="" loading="lazy"></p>
<h3>MongoDB Skip方法</h3>
<p>我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。</p>
<h4>语法</h4>
<p>skip() 方法脚本语法格式如下:</p>
<div class="cnblogs_code">
<pre>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)</pre>
</div>
<h4>实例</h4>
<p>查询Contacts集合中的第2条数据:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># 显示一条如何在跳过一条
db.Contacts.find().limit(</span><span style="color: rgba(128, 0, 128, 1)">1</span>).skip(<span style="color: rgba(128, 0, 128, 1)">1</span>)</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122014933204-728109.png" alt="" loading="lazy"></p>
<h2>MongoDB排序</h2>
<p>在MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。</p>
<h3>语法</h3>
<p>sort()方法基本语法如下所示:</p>
<div class="cnblogs_code">
<pre>db.COLLECTION_NAME.find().sort({KEY:<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<h3>示例</h3>
<p>在Contacts集合中让name按照降序来排列:</p>
<div class="cnblogs_code">
<pre>db.Contacts.find().sort({<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122015706093-527988653.png" alt="" loading="lazy"></p>
<h2>MongoDB索引</h2>
<h3>说明</h3>
<ul>
<li>索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。</li>
<li>这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。</li>
<li>索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。</li>
</ul>
<h3>语法</h3>
<p>createIndex()方法基本语法格式如下所示:</p>
<blockquote>
<p>注意:语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。</p>
</blockquote>
<div class="cnblogs_code">
<pre>db.collection.createIndex(keys, options)</pre>
</div>
<h3>createIndex() 接收可选参数,可选参数列表如下:</h3>
<table class="w3-table-all notranslate">
<tbody>
<tr><th>Parameter</th><th>Type</th><th>Description</th></tr>
<tr>
<td>background</td>
<td>Boolean</td>
<td>建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。</td>
</tr>
<tr>
<td>unique</td>
<td>Boolean</td>
<td>建立的索引是否唯一。指定为true创建唯一索引。默认值为false.</td>
</tr>
<tr>
<td>name</td>
<td>string</td>
<td>索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。</td>
</tr>
<tr>
<td>dropDups</td>
<td>Boolean</td>
<td><span class="important">3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.</span></td>
</tr>
<tr>
<td>sparse</td>
<td>Boolean</td>
<td>对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.</td>
</tr>
<tr>
<td>expireAfterSeconds</td>
<td>integer</td>
<td>指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。</td>
</tr>
<tr>
<td>v</td>
<td>index version</td>
<td>索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。</td>
</tr>
<tr>
<td>weights</td>
<td>document</td>
<td>索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。</td>
</tr>
<tr>
<td>default_language</td>
<td>string</td>
<td>对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语</td>
</tr>
<tr>
<td>language_override</td>
<td>string</td>
<td>对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.</td>
</tr>
</tbody>
</table>
<h4>实例</h4>
<h4>1、为Contacts集合中的name字段按降序设置索引</h4>
<div class="cnblogs_code">
<pre>db.Contacts.createIndex({<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122020343380-158392874.png" alt="" loading="lazy"></p>
<h4>2、为Contacts集合中的name字段和phone字段同时按降序设置索引(关系型数据库中称作复合索引)</h4>
<div class="cnblogs_code">
<pre>db.Contacts.createIndex({<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">phone</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-<span style="color: rgba(128, 0, 128, 1)">1</span>})</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122020356217-1775240539.png" alt="" loading="lazy"></p>
<h4>3、以后台方式给Contacts集合中的phone字段按降序设置索引</h4>
<div class="cnblogs_code">
<pre>db.Contacts.createIndex({<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">phone</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">1</span>}, {background: <span style="color: rgba(0, 0, 255, 1)">true</span>})</pre>
</div>
<h2>MongoDB聚合</h2>
<p>MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。</p>
<p>类似SQL语句中的 <span class="marked">count(*)。</span></p>
<h3>语法</h3>
<p>aggregate() 方法的基本语法格式如下所示:</p>
<div class="cnblogs_code">
<pre>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)</pre>
</div>
<h3>首先创建一个BlogCollection集合,并批量插入多个文档数据:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">#创建集合
use BolgCollection
#批量插入集合文档数据
db.BlogCollection.insert([{
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">学习MongoDB</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
description: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MongoDB is no sql database</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
by_user: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">时光者</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
likes: </span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">
},
{
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">NoSQL Overview</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
description: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">No sql database is very fast</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
by_user: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">时光者</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
likes: </span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
},
{
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Docker入门学习</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
description: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Docker入门学习教程</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
by_user: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">时光者</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
likes: </span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">
},
{
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.Net Core入门学习</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
description: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.Net Core入门学习</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
by_user: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">大姚</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
likes: </span><span style="color: rgba(128, 0, 128, 1)">750</span><span style="color: rgba(0, 0, 0, 1)">
},
{
title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Golang入门学习</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
description: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Golang入门学习</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
by_user: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">小艺</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
likes: </span><span style="color: rgba(128, 0, 128, 1)">750</span><span style="color: rgba(0, 0, 0, 1)">
}])
#查询集合所有文档数据
db.BlogCollection.find() </span></pre>
</div>
<h3>$sum分组统计以上BlogCollection集合每个作者所写的文章数:</h3>
<div class="cnblogs_code">
<pre>db.BlogCollection.aggregate([{$group : {_id : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$by_user</span><span style="color: rgba(128, 0, 0, 1)">"</span>, num_tutorial : {$sum : <span style="color: rgba(128, 0, 128, 1)">1</span>}}}])</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122022727207-533684941.png" alt="" loading="lazy"></p>
<p>类似于SQL语句:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">select</span> by_user, count(*) <span style="color: rgba(0, 0, 255, 1)">from</span> BlogCollection group by by_user</pre>
</div>
<h3>$sum 计算likes的总和</h3>
<div class="cnblogs_code">
<pre>db.BlogCollection.aggregate([{$group : {_id : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$by_user</span><span style="color: rgba(128, 0, 0, 1)">"</span>, num_tutorial : {$sum : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$likes</span><span style="color: rgba(128, 0, 0, 1)">"</span>}}}])</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122023811239-1515961917.png" alt="" loading="lazy"></p>
<h3>$avg 计算Likes的平均值</h3>
<div class="cnblogs_code">
<pre>db.BlogCollection.aggregate([{$group : {_id : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$by_user</span><span style="color: rgba(128, 0, 0, 1)">"</span>, num_tutorial : {$avg : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$likes</span><span style="color: rgba(128, 0, 0, 1)">"</span>}}}])</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122023847931-709263483.png" alt="" loading="lazy"></p>
<h3>$min 获取集合中所有文档对应值得最小值:</h3>
<div class="cnblogs_code">
<pre>db.BlogCollection.aggregate([{$group : {_id : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$by_user</span><span style="color: rgba(128, 0, 0, 1)">"</span>, num_tutorial : {$min : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$likes</span><span style="color: rgba(128, 0, 0, 1)">"</span>}}}])</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122024145301-533422873.png" alt="" loading="lazy"></p>
<h3>$max 获取集合中所有文档对应值得最大值:</h3>
<div class="cnblogs_code">
<pre>db.BlogCollection.aggregate([{$group : {_id : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$by_user</span><span style="color: rgba(128, 0, 0, 1)">"</span>, num_tutorial : {$max : <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$likes</span><span style="color: rgba(128, 0, 0, 1)">"</span>}}}])</pre>
</div>
<p><img src="https://img2022.cnblogs.com/blog/1336199/202211/1336199-20221122024231466-144891269.png" alt="" loading="lazy"></p>
<h2>参考文章:</h2>
<ul>
<li><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://www.mongodb.org.cn/tutorial/10.html</span></span></li>
<li><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://www.runoob.com/mongodb/mongodb-tutorial.html</span></span></li>
<li class="title-article"><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://www.mongodb.com/zh-cn/docs/manual/crud</span></span></li>
</ul>
</div>
<div id="MySignature" role="contentinfo">
<blockquote >
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者名称:</span>追逐时光者</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'><span style='font-size: 17px; '>作者简介:</span>一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。</p>
<p style='font-family:YouYuan;font-size: 16px;margin: 0 auto 0.01em auto;'>
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【♥推荐♥】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。
</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/Can-daydayup/p/16840085.html
頁:
[1]