MongoDB基础教程系列-- MongoDB 聚合管道
<p>在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘。在 MongoDB 中,聚合操作的输入是集合中的文档,输出可以是一个文档,也可以是多条文档。</p><p>MongoDB 提供了非常强大的聚合操作,有三种方式:</p>
<ul>
<li>聚合管道(Aggregation Pipeline)</li>
<li>单目的聚合操作(Single Purpose Aggregation Operation)</li>
<li>MapReduce 编程模型</li>
</ul>
<p>在本篇中,重点讲解聚合管道和单目的聚合操作,MapReduce 编程模型会在后续的文章中讲解。</p>
<h2>1、聚合管道</h2>
<p>聚合管道是 MongoDB 2.2版本引入的新功能。它由阶段(Stage)组成,文档在一个阶段处理完毕后,聚合管道会把处理结果传到下一个阶段。</p>
<p><strong>聚合管道功能:</strong></p>
<ul>
<li>对文档进行过滤,查询出符合条件的文档</li>
<li>对文档进行变换,改变文档的输出形式</li>
</ul>
<p>每个阶段用<strong>阶段操作符(Stage Operators)</strong>定义,在每个阶段操作符中可以用<strong>表达式操作符(Expression Operators)</strong>计算总和、平均值、拼接分割字符串等相关操作,直到每个阶段进行完成,最终返回结果,返回的结果可以直接输出,也可以存储到集合中。</p>
<p>MongoDB 中使用 <strong><span class="pln">db<span class="pun">.<span class="pln">COLLECTION_NAME<span class="pun">.aggregate([{<stage>},...])</span></span></span></span></strong> 方法来构建和使用聚合管道。先看下官网给的实例,感受一下聚合管道的用法。</p>
<p><img src="https://images2015.cnblogs.com/blog/782445/201704/782445-20170410112205954-187879090.png"></p>
<p>实例中,$match 用于获取 status = "A" 的记录,然后将符合条件的记录送到下一阶段 $group 中进行分组求和计算,最后返回 Results。其中,$match、$group 都是阶段操作符,而阶段 $group 中用到的 $sum 是表达式操作符。</p>
<p>在下面,我们通过范例分别对阶段操作符和表达式操作符进行详解。</p>
<h3>1.1、阶段操作符</h3>
<p>使用阶段操作符之前,我们先看一下 article 集合中的文档列表,也就是范例中用到的数据。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_532213" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.find().pretty()</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Database'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">},</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7571"</code><code class="sql plain">)</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Index"</code><code class="sql plain">,</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Index'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 3,</code></div>
<div class="line number16 index15 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:43:39.236Z"</code><code class="sql plain">)</code></div>
<div class="line number17 index16 alt2"><code class="sql plain">},</code></div>
<div class="line number18 index17 alt1"><code class="sql plain">{</code></div>
<div class="line number19 index18 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7572"</code><code class="sql plain">)</code></div>
<div class="line number20 index19 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Query"</code><code class="sql plain">,</code></div>
<div class="line number21 index20 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"eryueyang"</code><code class="sql plain">,</code></div>
<div class="line number22 index21 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number23 index22 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 8,</code></div>
<div class="line number24 index23 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:44:56.276Z"</code><code class="sql plain">)</code></div>
<div class="line number25 index24 alt2"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4><strong>1.1.1、$project </strong></h4>
<p><strong>作用</strong></p>
<p>修改文档的结构,可以用来重命名、增加或删除文档中的字段。</p>
<p><strong>范例1</strong></p>
<p>只返回文档中 title 和 author 字段</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_158985" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate([{$project:{_id:0, title:1, author:1 }}])</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">, </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code> <code class="sql plain">},</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Index"</code><code class="sql plain">, </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code> <code class="sql plain">},</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Query"</code><code class="sql plain">, </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"eryueyang"</code> <code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>因为字段 _id 是默认显示的,这里必须用 _id:0 把字段_id过滤掉。</p>
<p><strong>范例2</strong></p>
<p>把文档中 pages 字段的值都增加10。并重命名成 newPages 字段。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_401956" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$project:{</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">_id:0,</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">title:1,</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">author:1,</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">newPages: {$</code><code class="sql keyword">add</code><code class="sql plain">:[</code><code class="sql string">"$Pages"</code><code class="sql plain">,10]}</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number12 index11 alt1"><code class="sql plain">)</code></div>
<div class="line number13 index12 alt2"><code class="sql plain">{ </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">, </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">, </code><code class="sql string">"newPages"</code><code class="sql plain">: 15 },</code></div>
<div class="line number14 index13 alt1"><code class="sql plain">{ </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Index"</code><code class="sql plain">, </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">, </code><code class="sql string">"newPages"</code><code class="sql plain">: 13 },</code></div>
<div class="line number15 index14 alt2"><code class="sql plain">{ </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Query"</code><code class="sql plain">, </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"eryueyang"</code><code class="sql plain">, </code><code class="sql string">"newPages"</code><code class="sql plain">: 18 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>其中,$add 是 加 的意思,是算术类型表达式操作符,具体表达式操作符,下面会讲到。</p>
<h4>1.1.2、$match</h4>
<p><strong>作用</strong></p>
<p>用于过滤文档。用法类似于 find() 方法中的参数。</p>
<p><strong>范例</strong></p>
<p>查询出文档中 pages 字段的值大于等于5的数据。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_328709" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$match: {</code><code class="sql string">"pages"</code><code class="sql plain">: {$gte: 5}}</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">).pretty()</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Database'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number15 index14 alt2"><code class="sql plain">},</code></div>
<div class="line number16 index15 alt1"><code class="sql plain">{</code></div>
<div class="line number17 index16 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7572"</code><code class="sql plain">)</code></div>
<div class="line number18 index17 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Query"</code><code class="sql plain">,</code></div>
<div class="line number19 index18 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"eryueyang"</code><code class="sql plain">,</code></div>
<div class="line number20 index19 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number21 index20 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 8,</code></div>
<div class="line number22 index21 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:44:56.276Z"</code><code class="sql plain">)</code></div>
<div class="line number23 index22 alt2"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>注:</strong></p>
<ul>
<li>在 $match 中不能使用 $where 表达式操作符</li>
<li>如果 $match 位于管道的第一个阶段,可以利用索引来提高查询效率</li>
<li>$match 中使用 $text 操作符的话,只能位于管道的第一阶段</li>
<li>$match 尽量出现在管道的最前面,过滤出需要的数据,在后续的阶段中可以提高效率。</li>
</ul>
<h4>1.1.3、$group</h4>
<p><strong>作用</strong></p>
<p>将集合中的文档进行分组,可用于统计结果。</p>
<p><strong>范例</strong></p>
<p>从 article 中得到每个 author 的文章数,并输入 author 和对应的文章数。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_189546" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$</code><code class="sql keyword">group</code><code class="sql plain">: {_id: </code><code class="sql string">"$author"</code><code class="sql plain">, total: {$</code><code class="sql color2">sum</code><code class="sql plain">: 1}}</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">)</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{</code><code class="sql string">"_id"</code> <code class="sql plain">: </code><code class="sql string">"eryueyang"</code><code class="sql plain">, </code><code class="sql string">"total"</code> <code class="sql plain">: 1}</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">{</code><code class="sql string">"_id"</code> <code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">, </code><code class="sql string">"total"</code> <code class="sql plain">: 2}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.1.4、$sort</h4>
<p><strong>作用</strong></p>
<p>将集合中的文档进行排序。</p>
<p><strong>范例</strong></p>
<p>让集合 article 以 pages 升序排列</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_105864" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate([{$sort: {</code><code class="sql string">"pages"</code><code class="sql plain">: 1}}]).pretty()</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7571"</code><code class="sql plain">)</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Index"</code><code class="sql plain">,</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Index'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 3,</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:43:39.236Z"</code><code class="sql plain">)</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">},</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Database'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number16 index15 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number17 index16 alt2"><code class="sql plain">},</code></div>
<div class="line number18 index17 alt1"><code class="sql plain">{</code></div>
<div class="line number19 index18 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7572"</code><code class="sql plain">)</code></div>
<div class="line number20 index19 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Query"</code><code class="sql plain">,</code></div>
<div class="line number21 index20 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"eryueyang"</code><code class="sql plain">,</code></div>
<div class="line number22 index21 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number23 index22 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 8,</code></div>
<div class="line number24 index23 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:44:56.276Z"</code><code class="sql plain">)</code></div>
<div class="line number25 index24 alt2"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> 如果以降序排列,则设置成 "pages": -1</p>
<h4>1.1.5、$limit</h4>
<p><strong>作用</strong></p>
<p>限制返回的文档数量</p>
<p><strong>范例</strong></p>
<p>返回集合 article 中前两条文档</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_410320" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate([{$limit: 2}]).pretty()</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Database'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">},</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7571"</code><code class="sql plain">)</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Index"</code><code class="sql plain">,</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Index'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 3,</code></div>
<div class="line number16 index15 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:43:39.236Z"</code><code class="sql plain">)</code></div>
<div class="line number17 index16 alt2"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.1.6、$skip</h4>
<p><strong>作用</strong></p>
<p>跳过指定数量的文档,并返回余下的文档。</p>
<p><strong>范例</strong></p>
<p>跳过集合 article 中一条文档,输出剩下的文档</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_307002" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate([{$skip: 1}]).pretty()</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7571"</code><code class="sql plain">)</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Index"</code><code class="sql plain">,</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Index'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 3,</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:43:39.236Z"</code><code class="sql plain">)</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">},</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7572"</code><code class="sql plain">)</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Query"</code><code class="sql plain">,</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"eryueyang"</code><code class="sql plain">,</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: [</code><code class="sql string">'Mongodb'</code><code class="sql plain">, </code><code class="sql string">'Query'</code><code class="sql plain">],</code></div>
<div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 8,</code></div>
<div class="line number16 index15 alt1"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:44:56.276Z"</code><code class="sql plain">)</code></div>
<div class="line number17 index16 alt2"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.1.7、$unwind</h4>
<p><strong>作用</strong></p>
<p>将文档中数组类型的字段拆分成多条,每条文档包含数组中的一个值。</p>
<p><strong>范例</strong></p>
<p>把集合 article 中 title="MongoDB Aggregate" 的 tags 字段拆分</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_897550" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$match: {</code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">}</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">},</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">$unwind: </code><code class="sql string">"$tags"</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql plain">).pretty()</code></div>
<div class="line number11 index10 alt2"><code class="sql plain">{</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: </code><code class="sql string">"Mongodb"</code><code class="sql plain">,</code></div>
<div class="line number16 index15 alt1"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number17 index16 alt2"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number18 index17 alt1"><code class="sql plain">},</code></div>
<div class="line number19 index18 alt2"><code class="sql plain">{</code></div>
<div class="line number20 index19 alt1"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number21 index20 alt2"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number22 index21 alt1"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number23 index22 alt2"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: </code><code class="sql string">"Database"</code><code class="sql plain">,</code></div>
<div class="line number24 index23 alt1"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number25 index24 alt2"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number26 index25 alt1"><code class="sql plain">},</code></div>
<div class="line number27 index26 alt2"><code class="sql plain">{</code></div>
<div class="line number28 index27 alt1"><code class="sql spaces"> </code><code class="sql string">"_id"</code><code class="sql plain">: ObjectId(</code><code class="sql string">"58e1d2f0bb1bbc3245fa7570"</code><code class="sql plain">)</code></div>
<div class="line number29 index28 alt2"><code class="sql spaces"> </code><code class="sql string">"title"</code><code class="sql plain">: </code><code class="sql string">"MongoDB Aggregate"</code><code class="sql plain">,</code></div>
<div class="line number30 index29 alt1"><code class="sql spaces"> </code><code class="sql string">"author"</code><code class="sql plain">: </code><code class="sql string">"liruihuan"</code><code class="sql plain">,</code></div>
<div class="line number31 index30 alt2"><code class="sql spaces"> </code><code class="sql string">"tags"</code><code class="sql plain">: </code><code class="sql string">"Query"</code><code class="sql plain">,</code></div>
<div class="line number32 index31 alt1"><code class="sql spaces"> </code><code class="sql string">"pages"</code><code class="sql plain">: 5,</code></div>
<div class="line number33 index32 alt2"><code class="sql spaces"> </code><code class="sql string">"time"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-04-09T11:42:39.736Z"</code><code class="sql plain">)</code></div>
<div class="line number34 index33 alt1"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p><strong>注:</strong></p>
<ul>
<li>$unwind 参数数组字段为空或不存在时,待处理的文档将会被忽略,该文档将不会有任何输出</li>
<li>$unwind 参数不是一个数组类型时,将会抛出异常</li>
<li>$unwind 所作的修改,只用于输出,不能改变原文档</li>
</ul>
<h3>1.2、表达式操作符</h3>
<p> 表达式操作符有很多操作类型,其中最常用的有布尔管道聚合操作、集合操作、比较聚合操作、算术聚合操作、字符串聚合操作、数组聚合操作、日期聚合操作、条件聚合操作、数据类型聚合操作等。每种类型都有很多用法,这里就不一一举例了。</p>
<h4>1.2.1、布尔管道聚合操作(Boolean Aggregation Operators)</h4>
<table class="docutils" border="1">
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$and</code></td>
<td>Returns <code class="docutils literal">true</code> only when <em>all</em> its expressions evaluate to <code class="docutils literal">true</code>. Accepts any number of argument expressions.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$or</code></td>
<td>Returns <code class="docutils literal">true</code> when <em>any</em> of its expressions evaluates to <code class="docutils literal">true</code>. Accepts any number of argument expressions.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$not</code></td>
<td>Returns the boolean value that is the opposite of its argument expression. Accepts a single argument expression.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_271763" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc1"</code><code class="sql plain">, description: </code><code class="sql string">"product 1"</code><code class="sql plain">, qty: 300 }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc2"</code><code class="sql plain">, description: </code><code class="sql string">"product 2"</code><code class="sql plain">, qty: 200 }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"xyz1"</code><code class="sql plain">, description: </code><code class="sql string">"product 3"</code><code class="sql plain">, qty: 250 }</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"VWZ1"</code><code class="sql plain">, description: </code><code class="sql string">"product 4"</code><code class="sql plain">, qty: 300 }</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 5, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"VWZ2"</code><code class="sql plain">, description: </code><code class="sql string">"product 5"</code><code class="sql plain">, qty: 180 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>确定 qty 是否大于250或者小于200</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_65832" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$project:</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">item: 1,</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">result: { $</code><code class="sql color1">or</code><code class="sql plain">: [ { $gt: [ </code><code class="sql string">"$qty"</code><code class="sql plain">, 250 ] }, { $lt: [ </code><code class="sql string">"$qty"</code><code class="sql plain">, 200 ] } ] }</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number11 index10 alt2"><code class="sql plain">)</code></div>
<div class="line number12 index11 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc1"</code><code class="sql plain">, </code><code class="sql string">"result"</code> <code class="sql plain">: </code><code class="sql keyword">true</code> <code class="sql plain">}</code></div>
<div class="line number13 index12 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc2"</code><code class="sql plain">, </code><code class="sql string">"result"</code> <code class="sql plain">: </code><code class="sql keyword">false</code> <code class="sql plain">}</code></div>
<div class="line number14 index13 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"xyz1"</code><code class="sql plain">, </code><code class="sql string">"result"</code> <code class="sql plain">: </code><code class="sql keyword">false</code> <code class="sql plain">}</code></div>
<div class="line number15 index14 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"VWZ1"</code><code class="sql plain">, </code><code class="sql string">"result"</code> <code class="sql plain">: </code><code class="sql keyword">true</code> <code class="sql plain">}</code></div>
<div class="line number16 index15 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 5, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"VWZ2"</code><code class="sql plain">, </code><code class="sql string">"result"</code> <code class="sql plain">: </code><code class="sql keyword">true</code> <code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.2.2、集合操作(Set Operators)</h4>
<p>用于集合操作,求集合的并集、交集、差集运算。</p>
<table class="docutils" border="1"><colgroup><col width="29%"><col width="71%"></colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$setEquals</code></td>
<td>Returns <code class="docutils literal">true</code> if the input sets have the same distinct elements. Accepts two or more argument expressions.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$setIntersection</code></td>
<td>Returns a set with elements that appear in <em>all</em> of the input sets. Accepts any number of argument expressions.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$setUnion</code></td>
<td>Returns a set with elements that appear in <em>any</em> of the input sets. Accepts any number of argument expressions.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$setDifference</code></td>
<td>Returns a set with elements that appear in the first set but not in the second set; i.e. performs a relative complement of the second set relative to the first. Accepts exactly two argument expressions.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$setIsSubset</code></td>
<td>Returns <code class="docutils literal">true</code> if all elements of the first set appear in the second set, including when the first set equals the second set; i.e. not a strict subset. Accepts exactly two argument expressions.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$anyElementTrue</code></td>
<td>Returns <code class="docutils literal">true</code> if <em>any</em> elements of a set evaluate to <code class="docutils literal">true</code>; otherwise, returns <code class="docutils literal">false</code>. Accepts a single argument expression.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$allElementsTrue</code></td>
<td>Returns <code class="docutils literal">true</code> if <em>no</em> element of a set evaluates to <code class="docutils literal">false</code>, otherwise, returns <code class="docutils literal">false</code>. Accepts a single argument expression.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_386556" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">] }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">] }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"green"</code> <code class="sql plain">] }</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ </code><code class="sql string">"green"</code><code class="sql plain">, </code><code class="sql string">"red"</code> <code class="sql plain">] }</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 5, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ ] }</code></div>
<div class="line number6 index5 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 6, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ [ </code><code class="sql string">"red"</code> <code class="sql plain">], [ </code><code class="sql string">"blue"</code> <code class="sql plain">] ] }</code></div>
<div class="line number7 index6 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 7, </code><code class="sql string">"A"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code> <code class="sql plain">: [ [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">] ] }</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 8, </code><code class="sql string">"A"</code> <code class="sql plain">: [ ], </code><code class="sql string">"B"</code> <code class="sql plain">: [ ] }</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 9, </code><code class="sql string">"A"</code> <code class="sql plain">: [ ], </code><code class="sql string">"B"</code> <code class="sql plain">: [ </code><code class="sql string">"red"</code> <code class="sql plain">] }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>求出集合 mycol 中 A 和 B 的交集</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_517074" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{ $project: { A:1, B: 1, allValues: { $setUnion: [ </code><code class="sql string">"$A"</code><code class="sql plain">, </code><code class="sql string">"$B"</code> <code class="sql plain">] }, _id: 0 } }</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">)</code></div>
<div class="line number6 index5 alt1"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code> <code class="sql plain">] }</code></div>
<div class="line number7 index6 alt2"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code> <code class="sql plain">] }</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"green"</code> <code class="sql plain">], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"green"</code> <code class="sql plain">] }</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ </code><code class="sql string">"green"</code><code class="sql plain">, </code><code class="sql string">"red"</code> <code class="sql plain">], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"green"</code> <code class="sql plain">] }</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ ], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code> <code class="sql plain">] }</code></div>
<div class="line number11 index10 alt2"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ [ </code><code class="sql string">"red"</code> <code class="sql plain">], [ </code><code class="sql string">"blue"</code> <code class="sql plain">] ], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code><code class="sql plain">, [ </code><code class="sql string">"red"</code> <code class="sql plain">], [ </code><code class="sql string">"blue"</code> <code class="sql plain">] ] }</code></div>
<div class="line number12 index11 alt1"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">], </code><code class="sql string">"B"</code><code class="sql plain">: [ [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">] ], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"blue"</code><code class="sql plain">, </code><code class="sql string">"red"</code><code class="sql plain">, [ </code><code class="sql string">"red"</code><code class="sql plain">, </code><code class="sql string">"blue"</code> <code class="sql plain">] ] }</code></div>
<div class="line number13 index12 alt2"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ ], </code><code class="sql string">"B"</code><code class="sql plain">: [ ], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ ] }</code></div>
<div class="line number14 index13 alt1"><code class="sql plain">{ </code><code class="sql string">"A"</code><code class="sql plain">: [ ], </code><code class="sql string">"B"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code> <code class="sql plain">], </code><code class="sql string">"allValues"</code><code class="sql plain">: [ </code><code class="sql string">"red"</code> <code class="sql plain">] }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.2.3、比较聚合操作(Comparison Aggregation Operators)</h4>
<table class="docutils" border="1"><colgroup><col width="26%"><col width="74%"></colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$cmp</code></td>
<td>Returns: <code class="docutils literal">0</code> if the two values are equivalent, <code class="docutils literal">1</code> if the first value is greater than the second, and <code class="docutils literal">-1</code> if the first value is less than the second.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$eq</code></td>
<td>Returns <code class="docutils literal">true</code> if the values are equivalent.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$gt</code></td>
<td>Returns <code class="docutils literal">true</code> if the first value is greater than the second.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$gte</code></td>
<td>Returns <code class="docutils literal">true</code> if the first value is greater than or equal to the second.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$lt</code></td>
<td>Returns <code class="docutils literal">true</code> if the first value is less than the second.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$lte</code></td>
<td>Returns <code class="docutils literal">true</code> if the first value is less than or equal to the second.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$ne</code></td>
<td>Returns <code class="docutils literal">true</code> if the values are <em>not</em> equivalent.</td>
</tr>
</tbody>
</table>
<p>这里就不举例了,之前的例子有用到过。</p>
<h4>1.2.4、算术聚合操作(Arithmetic Aggregation Operators)</h4>
<table class="docutils" border="1">
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$abs</code></td>
<td>Returns the absolute value of a number.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$add</code></td>
<td>Adds numbers to return the sum, or adds numbers and a date to return a new date. If adding numbers and a date, treats the numbers as milliseconds. Accepts any number of argument expressions, but at most, one expression can resolve to a date.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$ceil</code></td>
<td>Returns the smallest integer greater than or equal to the specified number.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$divide</code></td>
<td>Returns the result of dividing the first number by the second. Accepts two argument expressions.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$exp</code></td>
<td>Raises <em>e</em> to the specified exponent.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$floor</code></td>
<td>Returns the largest integer less than or equal to the specified number.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$ln</code></td>
<td>Calculates the natural log of a number.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$log</code></td>
<td>Calculates the log of a number in the specified base.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$log10</code></td>
<td>Calculates the log base 10 of a number.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$mod</code></td>
<td>Returns the remainder of the first number divided by the second. Accepts two argument expressions.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$multiply</code></td>
<td>Multiplies numbers to return the product. Accepts any number of argument expressions.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$pow</code></td>
<td>Raises a number to the specified exponent.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$sqrt</code></td>
<td>Calculates the square root.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$subtract</code></td>
<td>Returns the result of subtracting the second value from the first. If the two values are numbers, return the difference. If the two values are dates, return the difference in milliseconds. If the two values are a date and a number in milliseconds, return the resulting date. Accepts two argument expressions. If the two values are a date and a number, specify the date argument first as it is not meaningful to subtract a date from a number.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$trunc</code></td>
<td>Truncates a number to its integer.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_381623" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ _id: 1, start: 5, </code><code class="sql keyword">end</code><code class="sql plain">: 8 }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ _id: 2, start: 4, </code><code class="sql keyword">end</code><code class="sql plain">: 4 }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ _id: 3, start: 9, </code><code class="sql keyword">end</code><code class="sql plain">: 7 }</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ _id: 4, start: 6, </code><code class="sql keyword">end</code><code class="sql plain">: 7 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>求集合 mycol 中 start 减去 end 的绝对值</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_400330" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate([</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">$project: { delta: { $</code><code class="sql color2">abs</code><code class="sql plain">: { $subtract: [ </code><code class="sql string">"$start"</code><code class="sql plain">, </code><code class="sql string">"$end"</code> <code class="sql plain">] } } }</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">])</code></div>
<div class="line number6 index5 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"delta"</code> <code class="sql plain">: 3 }</code></div>
<div class="line number7 index6 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"delta"</code> <code class="sql plain">: 0 }</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"delta"</code> <code class="sql plain">: 2 }</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"delta"</code> <code class="sql plain">: 1 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.2.5、字符串聚合操作(String Aggregation Operators)</h4>
<table class="docutils" border="1"><colgroup><col width="29%"><col width="71%"></colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$concat</code></td>
<td>Concatenates any number of strings.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$indexOfBytes</code></td>
<td>Searches a string for an occurence of a substring and returns the UTF-8 byte index of the first occurence. If the substring is not found, returns <code class="docutils literal">-1</code>.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$indexOfCP</code></td>
<td>Searches a string for an occurence of a substring and returns the UTF-8 code point index of the first occurence. If the substring is not found, returns <code class="docutils literal">-1</code>.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$split</code></td>
<td>Splits a string into substrings based on a delimiter. Returns an array of substrings. If the delimiter is not found within the string, returns an array containing the original string.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$strLenBytes</code></td>
<td>Returns the number of UTF-8 encoded bytes in a string.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$strLenCP</code></td>
<td>Returns the number of UTF-8 code points in a string.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$strcasecmp</code></td>
<td>Performs case-insensitive string comparison and returns: <code class="docutils literal">0</code> if two strings are equivalent, <code class="docutils literal">1</code> if the first string is greater than the second, and <code class="docutils literal">-1</code> if the first string is less than the second.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$substr</code></td>
<td>Deprecated. Use <code class="xref mongodb mongodb-expression docutils literal">$substrBytes</code> or <code class="xref mongodb mongodb-expression docutils literal">$substrCP</code>.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$substrBytes</code></td>
<td>Returns the substring of a string. Starts with the character at the specified UTF-8 byte index (zero-based) in the string and continues for the specified number of bytes.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$substrCP</code></td>
<td>Returns the substring of a string. Starts with the character at the specified UTF-8 code point (CP) index (zero-based) in the string and continues for the number of code points specified.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$toLower</code></td>
<td>Converts a string to lowercase. Accepts a single argument expression.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$toUpper</code></td>
<td>Converts a string to uppercase. Accepts a single argument expression.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_769859" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Berkeley, CA"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 648 }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Bend, OR"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 491 }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Kensington, CA"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 233 }</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Eugene, OR"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 842 }</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 5, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Reno, NV"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 655 }</code></div>
<div class="line number6 index5 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 6, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Portland, OR"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 408 }</code></div>
<div class="line number7 index6 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 7, </code><code class="sql string">"city"</code> <code class="sql plain">: </code><code class="sql string">"Sacramento, CA"</code><code class="sql plain">, </code><code class="sql string">"qty"</code> <code class="sql plain">: 574 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>以 ',' 分割集合 mycol 中字符串city的值,用 $unwind 拆分成多个文档,匹配出城市名称只有两个字母的城市,并求和各个城市中 qty 的值,最后以降序排序。</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_921992" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate([</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">{ $project : { city_state : { $split: [</code><code class="sql string">"$city"</code><code class="sql plain">, </code><code class="sql string">", "</code><code class="sql plain">] }, qty : 1 } },</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{ $unwind : </code><code class="sql string">"$city_state"</code> <code class="sql plain">},</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">{ $match : { city_state : /{2}/ } },</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">{ $</code><code class="sql keyword">group</code> <code class="sql plain">: { _id: { </code><code class="sql string">"state"</code> <code class="sql plain">: </code><code class="sql string">"$city_state"</code> <code class="sql plain">}, total_qty : { </code><code class="sql string">"$sum"</code> <code class="sql plain">: </code><code class="sql string">"$qty"</code> <code class="sql plain">} } },</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">{ $sort : { total_qty : -1 } }</code></div>
<div class="line number7 index6 alt2"><code class="sql plain">])</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: { </code><code class="sql string">"state"</code> <code class="sql plain">: </code><code class="sql string">"OR"</code> <code class="sql plain">}, </code><code class="sql string">"total_qty"</code> <code class="sql plain">: 1741 }</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: { </code><code class="sql string">"state"</code> <code class="sql plain">: </code><code class="sql string">"CA"</code> <code class="sql plain">}, </code><code class="sql string">"total_qty"</code> <code class="sql plain">: 1455 }</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: { </code><code class="sql string">"state"</code> <code class="sql plain">: </code><code class="sql string">"NV"</code> <code class="sql plain">}, </code><code class="sql string">"total_qty"</code> <code class="sql plain">: 655 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.2.6、数组聚合操作(Array Aggregation Operators)</h4>
<p> </p>
<table class="docutils" border="1">
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$arrayElemAt</code></td>
<td>Returns the element at the specified array index.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$concatArrays</code></td>
<td>Concatenates arrays to return the concatenated array.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$filter</code></td>
<td>Selects a subset of the array to return an array with only the elements that match the filter condition.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$indexOfArray</code></td>
<td>Searches an array for an occurence of a specified value and returns the array index of the first occurence. If the substring is not found, returns <code class="docutils literal">-1</code>.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$isArray</code></td>
<td>Determines if the operand is an array. Returns a boolean.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$range</code></td>
<td>Outputs an array containing a sequence of integers according to user-defined inputs.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$reverseArray</code></td>
<td>Returns an array with the elements in reverse order.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$reduce</code></td>
<td>Applies an expression to each element in an array and combines them into a single value.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$size</code></td>
<td>Returns the number of elements in the array. Accepts a single expression as argument.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$slice</code></td>
<td>Returns a subset of an array.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$zip</code></td>
<td>Merge two lists together.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$in</code></td>
<td>Returns a boolean indicating whether a specified value is in an array.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_627727" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"dave123"</code><code class="sql plain">, favorites: [ </code><code class="sql string">"chocolate"</code><code class="sql plain">, </code><code class="sql string">"cake"</code><code class="sql plain">, </code><code class="sql string">"butter"</code><code class="sql plain">, </code><code class="sql string">"apples"</code> <code class="sql plain">] }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"li"</code><code class="sql plain">, favorites: [ </code><code class="sql string">"apples"</code><code class="sql plain">, </code><code class="sql string">"pudding"</code><code class="sql plain">, </code><code class="sql string">"pie"</code> <code class="sql plain">] }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"ahn"</code><code class="sql plain">, favorites: [ </code><code class="sql string">"pears"</code><code class="sql plain">, </code><code class="sql string">"pecans"</code><code class="sql plain">, </code><code class="sql string">"chocolate"</code><code class="sql plain">, </code><code class="sql string">"cherries"</code> <code class="sql plain">] }</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"ty"</code><code class="sql plain">, favorites: [ </code><code class="sql string">"ice cream"</code> <code class="sql plain">] }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>求出集合 mycol 中 favorites 的第一项和最后一项</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_836562" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate([</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">$project:</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql keyword">name</code><code class="sql plain">: 1,</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql keyword">first</code><code class="sql plain">: { $arrayElemAt: [ </code><code class="sql string">"$favorites"</code><code class="sql plain">, 0 ] },</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql keyword">last</code><code class="sql plain">: { $arrayElemAt: [ </code><code class="sql string">"$favorites"</code><code class="sql plain">, -1 ] }</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">])</code></div>
<div class="line number11 index10 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"dave123"</code><code class="sql plain">, </code><code class="sql string">"first"</code> <code class="sql plain">: </code><code class="sql string">"chocolate"</code><code class="sql plain">, </code><code class="sql string">"last"</code> <code class="sql plain">: </code><code class="sql string">"apples"</code> <code class="sql plain">}</code></div>
<div class="line number12 index11 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"li"</code><code class="sql plain">, </code><code class="sql string">"first"</code> <code class="sql plain">: </code><code class="sql string">"apples"</code><code class="sql plain">, </code><code class="sql string">"last"</code> <code class="sql plain">: </code><code class="sql string">"pie"</code> <code class="sql plain">}</code></div>
<div class="line number13 index12 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"ahn"</code><code class="sql plain">, </code><code class="sql string">"first"</code> <code class="sql plain">: </code><code class="sql string">"pears"</code><code class="sql plain">, </code><code class="sql string">"last"</code> <code class="sql plain">: </code><code class="sql string">"cherries"</code> <code class="sql plain">}</code></div>
<div class="line number14 index13 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 4, </code><code class="sql string">"name"</code> <code class="sql plain">: </code><code class="sql string">"ty"</code><code class="sql plain">, </code><code class="sql string">"first"</code> <code class="sql plain">: </code><code class="sql string">"ice cream"</code><code class="sql plain">, </code><code class="sql string">"last"</code> <code class="sql plain">: </code><code class="sql string">"ice cream"</code> <code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.2.7、日期聚合操作(Date Aggregation Operators)</h4>
<table class="docutils" border="1">
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$dayOfYear</code></td>
<td>Returns the day of the year for a date as a number between 1 and 366 (leap year).</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$dayOfMonth</code></td>
<td>Returns the day of the month for a date as a number between 1 and 31.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$dayOfWeek</code></td>
<td>Returns the day of the week for a date as a number between 1 (Sunday) and 7 (Saturday).</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$year</code></td>
<td>Returns the year for a date as a number (e.g. 2014).</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$month</code></td>
<td>Returns the month for a date as a number between 1 (January) and 12 (December).</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$week</code></td>
<td>Returns the week number for a date as a number between 0 (the partial week that precedes the first Sunday of the year) and 53 (leap year).</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$hour</code></td>
<td>Returns the hour for a date as a number between 0 and 23.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$minute</code></td>
<td>Returns the minute for a date as a number between 0 and 59.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$second</code></td>
<td>Returns the seconds for a date as a number between 0 and 60 (leap seconds).</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$millisecond</code></td>
<td>Returns the milliseconds of a date as a number between 0 and 999.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$dateToString</code></td>
<td>Returns the date as a formatted string.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$isoDayOfWeek</code></td>
<td>Returns the weekday number in ISO 8601 format, ranging from <code class="docutils literal">1</code> (for Monday) to <code class="docutils literal">7</code> (for Sunday).</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$isoWeek</code></td>
<td>Returns the week number in ISO 8601 format, ranging from <code class="docutils literal">1</code> to <code class="docutils literal">53</code>. Week numbers start at <code class="docutils literal">1</code> with the week (Monday through Sunday) that contains the year’s first Thursday.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$isoWeekYear</code></td>
<td>Returns the year number in ISO 8601 format. The year starts with the Monday of week 1 (ISO 8601) and ends with the Sunday of the last week (ISO 8601).</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_666459" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc"</code><code class="sql plain">, </code><code class="sql string">"price"</code> <code class="sql plain">: 10, </code><code class="sql string">"quantity"</code> <code class="sql plain">: 2, </code><code class="sql string">"date"</code> <code class="sql plain">: ISODate(</code><code class="sql string">"2017-01-01T08:15:39.736Z"</code><code class="sql plain">) }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>得到集合 mycol 中 date 字段的相关日期值</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_1690" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$project:</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql color2">year</code><code class="sql plain">: { $</code><code class="sql color2">year</code><code class="sql plain">: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql color2">month</code><code class="sql plain">: { $</code><code class="sql color2">month</code><code class="sql plain">: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql color2">day</code><code class="sql plain">: { $dayOfMonth: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql keyword">hour</code><code class="sql plain">: { $</code><code class="sql keyword">hour</code><code class="sql plain">: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql plain">minutes: { $</code><code class="sql keyword">minute</code><code class="sql plain">: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql plain">seconds: { $</code><code class="sql keyword">second</code><code class="sql plain">: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql plain">milliseconds: { $millisecond: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql plain">dayOfYear: { $dayOfYear: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number14 index13 alt1"><code class="sql spaces"> </code><code class="sql plain">dayOfWeek: { $dayOfWeek: </code><code class="sql string">"$date"</code> <code class="sql plain">},</code></div>
<div class="line number15 index14 alt2"><code class="sql spaces"> </code><code class="sql plain">week: { $week: </code><code class="sql string">"$date"</code> <code class="sql plain">}</code></div>
<div class="line number16 index15 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number17 index16 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number18 index17 alt1"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number19 index18 alt2"><code class="sql plain">)</code></div>
<div class="line number20 index19 alt1"><code class="sql plain">{</code></div>
<div class="line number21 index20 alt2"><code class="sql spaces"> </code><code class="sql string">"_id"</code> <code class="sql plain">: 1,</code></div>
<div class="line number22 index21 alt1"><code class="sql spaces"> </code><code class="sql string">"year"</code> <code class="sql plain">: 2017,</code></div>
<div class="line number23 index22 alt2"><code class="sql spaces"> </code><code class="sql string">"month"</code> <code class="sql plain">: 1,</code></div>
<div class="line number24 index23 alt1"><code class="sql spaces"> </code><code class="sql string">"day"</code> <code class="sql plain">: 1,</code></div>
<div class="line number25 index24 alt2"><code class="sql spaces"> </code><code class="sql string">"hour"</code> <code class="sql plain">: 8,</code></div>
<div class="line number26 index25 alt1"><code class="sql spaces"> </code><code class="sql string">"minutes"</code> <code class="sql plain">: 15,</code></div>
<div class="line number27 index26 alt2"><code class="sql spaces"> </code><code class="sql string">"seconds"</code> <code class="sql plain">: 39,</code></div>
<div class="line number28 index27 alt1"><code class="sql spaces"> </code><code class="sql string">"milliseconds"</code> <code class="sql plain">: 736,</code></div>
<div class="line number29 index28 alt2"><code class="sql spaces"> </code><code class="sql string">"dayOfYear"</code> <code class="sql plain">: 1,</code></div>
<div class="line number30 index29 alt1"><code class="sql spaces"> </code><code class="sql string">"dayOfWeek"</code> <code class="sql plain">: 1,</code></div>
<div class="line number31 index30 alt2"><code class="sql spaces"> </code><code class="sql string">"week"</code> <code class="sql plain">: 0</code></div>
<div class="line number32 index31 alt1"><code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h4>1.2.8、条件聚合操作(Conditional Aggregation Operators)</h4>
<table class="docutils" border="1"><colgroup><col width="24%"><col width="76%"></colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$cond</code></td>
<td>A ternary operator that evaluates one expression, and depending on the result, returns the value of one of the other two expressions. Accepts either three expressions in an ordered list or three named parameters.</td>
</tr>
<tr class="row-odd">
<td><code class="xref mongodb mongodb-expression docutils literal">$ifNull</code></td>
<td>Returns either the non-null result of the first expression or the result of the second expression if the first expression results in a null result. Null result encompasses instances of undefined values or missing fields. Accepts two expressions as arguments. The result of the second expression can be null.</td>
</tr>
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$switch</code></td>
<td>Evaluates a series of case expressions. When it finds an expression which evaluates to <code class="docutils literal">true</code>, <code class="docutils literal">$switch</code> executes a specified expression and breaks out of the control flow.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_8178" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc1"</code><code class="sql plain">, qty: 300 }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc2"</code><code class="sql plain">, qty: 200 }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"xyz1"</code><code class="sql plain">, qty: 250 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>如果集合 mycol 中 qty 字段值大于等于250,则返回30,否则返回20</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_251608" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate(</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">[</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">$project:</code></div>
<div class="line number5 index4 alt2"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number6 index5 alt1"><code class="sql spaces"> </code><code class="sql plain">item: 1,</code></div>
<div class="line number7 index6 alt2"><code class="sql spaces"> </code><code class="sql plain">discount:</code></div>
<div class="line number8 index7 alt1"><code class="sql spaces"> </code><code class="sql plain">{</code></div>
<div class="line number9 index8 alt2"><code class="sql spaces"> </code><code class="sql plain">$cond: { if: { $gte: [ </code><code class="sql string">"$qty"</code><code class="sql plain">, 250 ] }, </code><code class="sql keyword">then</code><code class="sql plain">: 30, </code><code class="sql keyword">else</code><code class="sql plain">: 20 }</code></div>
<div class="line number10 index9 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number11 index10 alt2"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number12 index11 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number13 index12 alt2"><code class="sql spaces"> </code><code class="sql plain">]</code></div>
<div class="line number14 index13 alt1"><code class="sql plain">)</code></div>
<div class="line number15 index14 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 1, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc1"</code><code class="sql plain">, </code><code class="sql string">"discount"</code> <code class="sql plain">: 30 }</code></div>
<div class="line number16 index15 alt1"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 2, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"abc2"</code><code class="sql plain">, </code><code class="sql string">"discount"</code> <code class="sql plain">: 20 }</code></div>
<div class="line number17 index16 alt2"><code class="sql plain">{ </code><code class="sql string">"_id"</code> <code class="sql plain">: 3, </code><code class="sql string">"item"</code> <code class="sql plain">: </code><code class="sql string">"xyz1"</code><code class="sql plain">, </code><code class="sql string">"discount"</code> <code class="sql plain">: 30 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> </p>
<h4>1.2.9、数据类型聚合操作(Data Type Aggregation Operators)</h4>
<table class="docutils" border="1"><colgroup><col width="34%"><col width="66%"></colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">名称</th><th class="head">说明</th></tr>
</thead>
<tbody valign="top">
<tr class="row-even">
<td><code class="xref mongodb mongodb-expression docutils literal">$type</code></td>
<td>Return the BSON data type of the field.</td>
</tr>
</tbody>
</table>
<p><strong>范例</strong></p>
<p>假如有一个集合 mycol</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_619890" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">{ _id: 0, a : 8 }</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">{ _id: 1, a : [ 41.63, 88.19 ] }</code></div>
<div class="line number3 index2 alt2"><code class="sql plain">{ _id: 2, a : { a : </code><code class="sql string">"apple"</code><code class="sql plain">, b : </code><code class="sql string">"banana"</code><code class="sql plain">, c: </code><code class="sql string">"carrot"</code> <code class="sql plain">} }</code></div>
<div class="line number4 index3 alt1"><code class="sql plain">{ _id: 3, a : </code><code class="sql string">"caribou"</code> <code class="sql plain">}</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">{ _id: 4, a : NumberLong(71) }</code></div>
<div class="line number6 index5 alt1"><code class="sql plain">{ _id: 5 }</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>获取文档中 a 字段的数据类型</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_456164" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.mycol.aggregate([{</code></div>
<div class="line number2 index1 alt1"><code class="sql spaces"> </code><code class="sql plain">$project: {</code></div>
<div class="line number3 index2 alt2"><code class="sql spaces"> </code><code class="sql plain">a : { $type: </code><code class="sql string">"$a"</code> <code class="sql plain">}</code></div>
<div class="line number4 index3 alt1"><code class="sql spaces"> </code><code class="sql plain">}</code></div>
<div class="line number5 index4 alt2"><code class="sql plain">}])</code></div>
<div class="line number6 index5 alt1"><code class="sql plain">{ _id: 0, </code><code class="sql string">"a"</code> <code class="sql plain">: </code><code class="sql string">"double"</code> <code class="sql plain">}</code></div>
<div class="line number7 index6 alt2"><code class="sql plain">{ _id: 1, </code><code class="sql string">"a"</code> <code class="sql plain">: </code><code class="sql string">"array"</code> <code class="sql plain">}</code></div>
<div class="line number8 index7 alt1"><code class="sql plain">{ _id: 2, </code><code class="sql string">"a"</code> <code class="sql plain">: </code><code class="sql string">"object"</code> <code class="sql plain">}</code></div>
<div class="line number9 index8 alt2"><code class="sql plain">{ _id: 3, </code><code class="sql string">"a"</code> <code class="sql plain">: </code><code class="sql string">"string"</code> <code class="sql plain">}</code></div>
<div class="line number10 index9 alt1"><code class="sql plain">{ _id: 4, </code><code class="sql string">"a"</code> <code class="sql plain">: </code><code class="sql string">"long"</code> <code class="sql plain">}</code></div>
<div class="line number11 index10 alt2"><code class="sql plain">{ _id: 5, </code><code class="sql string">"a"</code> <code class="sql plain">: </code><code class="sql string">"missing"</code> <code class="sql plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h3>1.3、聚合管道优化</h3>
<p>默认情况下,整个集合作为聚合管道的输入,为了提高处理数据的效率,可以使用一下策略:</p>
<ul>
<li>将 $match 和 $sort 放到管道的前面,可以给集合建立索引,来提高处理数据的效率。</li>
<li>可以用 $match、$limit、$skip 对文档进行提前过滤,以减少后续处理文档的数量。</li>
</ul>
<p>当聚合管道执行命令时,MongoDB 也会对各个阶段自动进行优化,主要包括以下几个情况:</p>
<ol>
<li>$sort + $match 顺序优化</li>
</ol>
<p>如果 $match 出现在 $sort 之后,优化器会自动把 $match 放到 $sort 前面</p>
<p>2. $skip + $limit 顺序优化</p>
<p>如果 $skip 在 $limit 之后,优化器会把 $limit 移动到 $skip 的前面,移动后 $limit的值等于原来的值加上 $skip 的值。</p>
<p>例如:移动前:{$skip: 10, $limit: 5},移动后:{$limit: 15, $skip: 10}</p>
<h3>1.4、聚合管道使用限制</h3>
<p>对聚合管道的限制主要是对 返回结果大小 和 内存 的限制。</p>
<p><strong>返回结果大小</strong></p>
<p>聚合结果返回的是一个文档,不能超过 16M,从 MongoDB 2.6版本以后,返回的结果可以是一个游标或者存储到集合中,返回的结果不受 16M 的限制。</p>
<p><strong>内存</strong></p>
<p>聚合管道的每个阶段最多只能用 100M 的内存,如果超过100M,会报错,如果需要处理大数据,可以使用 allowDiskUse 选项,存储到磁盘上。</p>
<h2 class="prettyprint prettyprinted">2、单目的聚合操作</h2>
<p>单目的聚合命令,常用的:count()、distinct(),与聚合管道相比,单目的聚合操作更简单,使用非常频繁。先通过 distinct() 看一下工作流程</p>
<p><img src="https://images2015.cnblogs.com/blog/782445/201704/782445-20170410225818282-590231252.png"></p>
<p>distinct() 的作用是去重。而 count() 是求文档的个数。</p>
<p>下面用 count() 方法举例说明一下</p>
<p>范例</p>
<p>求出集合 article 中 time 值大于 2017-04-09 的文档个数</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_860432" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">>db.article.</code><code class="sql color2">count</code><code class="sql plain">( { </code><code class="sql keyword">time</code><code class="sql plain">: { $gt: new </code><code class="sql keyword">Date</code><code class="sql plain">(</code><code class="sql string">'04/09/2017'</code><code class="sql plain">) } } )</code></div>
<div class="line number2 index1 alt1"><code class="sql plain">3</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>这个语句等价于</p>
<div class="cnblogs_Highlighter sh-gutter">
<div>
<div id="highlighter_505477" class="syntaxhighlightersql">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="sql plain">db.article.find( { </code><code class="sql keyword">time</code><code class="sql plain">: { $gt: new </code><code class="sql keyword">Date</code><code class="sql plain">(</code><code class="sql string">'04/09/2017'</code><code class="sql plain">) } } ).</code><code class="sql color2">count</code><code class="sql plain">()</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/yunlongaimeng/p/11460291.html
頁:
[1]