第几个夏天 發表於 2020-1-4 14:07:00

MySQL与MongoDB查询互转

<h3>Mysql与MongoDB查询互转</h3>
<p><span style="color: rgba(255, 0, 0, 1)">mongo查询严格要求数据格式!</span></p>
<p>1、只想查出某些数据,不想全部数据都查出来</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> name <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">;

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {},
    {
    _id : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span><span style="color: rgba(0, 0, 0, 1)">,
    name : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span><span style="color: rgba(0, 0, 0, 1)">
   }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>说明:user是集合的名称,find里面两个{},第一个留空是想所有数据都查出来,加条件的话类型mysql的where,第二个{}表示的意思类似mysql后面的select部分,0代表不显示,1代表显示。</p>
<p>&nbsp;</p>
<p>2、分页查询</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> limit <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span>,<span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span><span style="color: rgba(0, 0, 0, 1)">;

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.find({}).skip(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span>).limit(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span>)</pre>
</div>
<p>&nbsp;</p>
<p>说明:mongo的skip和limit与mysql同理,mysql的limit第一个参数是跳过的数据量与mongo的skip类似,比如第三页的数据是从20开始的,mysql:limit 20,10,即:limit (page-1)*size,size</p>
<p>&nbsp;</p>
<p>3、条件查询</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> name <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> id <span style="color: rgba(128, 128, 128, 1)">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span><span style="color: rgba(0, 0, 0, 1)">;

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    { id : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1 </span><span style="color: rgba(0, 0, 0, 1)">},
    { name : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1 </span><span style="color: rgba(0, 0, 0, 1)">}
)</span></pre>
</div>
<p>&nbsp;</p>
<p>说明:由于有严格要求数据格式,若存到mongo的id是字符串格式的话,查询的条件得加上双引号""</p>
<p>&nbsp;</p>
<p>4、范围查询</p>
<table style="height: 100px; width: 454px" border="0">
<tbody>
<tr>
<td style="text-align: center">MySQL</td>
<td style="text-align: center">MongoDB</td>
<td style="text-align: center">remark</td>
</tr>
<tr>
<td style="text-align: center">&gt;</td>
<td style="text-align: center">$gt</td>
<td style="text-align: center">大于</td>
</tr>
<tr>
<td style="text-align: center">&lt;</td>
<td style="text-align: center">$lt</td>
<td style="text-align: center">小于</td>
</tr>
<tr>
<td style="text-align: center">&gt;=</td>
<td style="text-align: center">$gte</td>
<td style="text-align: center">大于等于</td>
</tr>
<tr>
<td style="text-align: center">&lt;=</td>
<td style="text-align: center">$lte</td>
<td style="text-align: center">小于等于</td>
</tr>
<tr>
<td style="text-align: center">!=</td>
<td style="text-align: center">$ne</td>
<td style="text-align: center">不等于</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> name <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> id <span style="color: rgba(128, 128, 128, 1)">&gt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span> <span style="color: rgba(128, 128, 128, 1)">and</span> id <span style="color: rgba(128, 128, 128, 1)">&lt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span><span style="color: rgba(0, 0, 0, 1)">;

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      id : {
            $gt : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span><span style="color: rgba(0, 0, 0, 1)">,
            $lt : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span><span style="color: rgba(0, 0, 0, 1)">
      }
    },
    { name : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1 </span><span style="color: rgba(0, 0, 0, 1)">}
)</span></pre>
</div>
<p>&nbsp;</p>
<p>说明:mysql的between其实就是&gt;=和&lt;=,字符串的话用范围查询好像会有问题,慎用!</p>
<p>&nbsp;</p>
<p>5、in查询</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> name <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> id <span style="color: rgba(128, 128, 128, 1)">in</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span>,<span style="color: rgba(128, 0, 0, 1); font-weight: bold">2</span><span style="color: rgba(0, 0, 0, 1)">);

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      id : {
            $</span><span style="color: rgba(128, 128, 128, 1)">in</span> : <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">1, 2</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">
      }
    },
    { name : </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1 </span><span style="color: rgba(0, 0, 0, 1)">}
)</span></pre>
</div>
<p>&nbsp;</p>
<p>说明:not in查询就把$in换成$nin</p>
<p>&nbsp;</p>
<p>6、条件统计count</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(255, 0, 255, 1)">count</span>(<span style="color: rgba(128, 128, 128, 1)">*</span>) <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> id <span style="color: rgba(128, 128, 128, 1)">&gt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span><span style="color: rgba(0, 0, 0, 1)">;

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      id :{
            $gt: </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
).</span><span style="color: rgba(255, 0, 255, 1)">count</span>()</pre>
</div>
<p>&nbsp;</p>
<p>7、all查询</p>
<p>mongo可以将数组存储起来,若想查询某个字段(是个数组)同时包含值a和b</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      detail: {
            $</span><span style="color: rgba(128, 128, 128, 1)">all</span> : <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">"7", "8"</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>说明:这个查询的结果集,detail字段同时包含字符串7和字符串8</p>
<p>&nbsp;</p>
<p>8、exists查询<br>比如我想找出所有包含字段name_real的结果集</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      name_real : {
            $</span><span style="color: rgba(128, 128, 128, 1)">exists</span><span style="color: rgba(0, 0, 0, 1)"> : true
      }
    }
)</span></pre>
</div>
<p><br>说明:上面查询的结果中,所有数据肯定都包含有name_real字段;改成false的话就变成不包含</p>
<p>&nbsp;</p>
<p>9、is null查询</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> age <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;

mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    { age : </span><span style="color: rgba(0, 0, 255, 1)">null </span><span style="color: rgba(0, 0, 0, 1)">}
)</span></pre>
</div>
<p>&nbsp;</p>
<p>但是这样会有问题,这个查询会把那些没有age字段的结果也查出来,结合exists优化下</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      age: {
            $</span><span style="color: rgba(128, 128, 128, 1)">in</span> : <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">null</span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">,
            $</span><span style="color: rgba(128, 128, 128, 1)">exists</span><span style="color: rgba(0, 0, 0, 1)"> : true
      }
    }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>查询is not null</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      age: {
            $ne : </span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
            $</span><span style="color: rgba(128, 128, 128, 1)">exists</span><span style="color: rgba(0, 0, 0, 1)"> : true
      }
    }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>10、取模运算<br>mongo提供取模运算,比如存储了一些数据,我想查出那些取模后等于某个值的数据可以使用$mod<br>比如下例查询年龄是10的倍数的用户</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> age <span style="color: rgba(128, 128, 128, 1)">%</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span> <span style="color: rgba(128, 128, 128, 1)">=</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">0</span><span style="color: rgba(0, 0, 0, 1)">;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      age:{
            $mod : </span><span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)"> 10 , 0 </span><span style="color: rgba(255, 0, 0, 1)">]</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>11、查询数据元素个数<br>由于mongo可以存储数组,如果想查询数组中只有两个元素的记录时,可以使用$size<br>比如下例查询有三个兴趣爱好的用户</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      favorite: {
            $size: </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">3</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>12、正则匹配查询<br>如果想用正则匹配查询,可以使用$regex<br>比如下例匹配年龄是10以下的用户</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find(
    {
      age: {
            $regex: </span><span style="color: rgba(128, 128, 128, 1)">/^</span>(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">1-9</span><span style="color: rgba(255, 0, 0, 1)">]</span>)$<span style="color: rgba(128, 128, 128, 1)">/</span><span style="color: rgba(0, 0, 0, 1)">
      }
    }
)</span></pre>
</div>
<p>&nbsp;</p>
<p>13、只取一部分数据<br>类似mysql的limit,mongo也可以只取一部分数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> limit <span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span><span style="color: rgba(0, 0, 0, 1)">;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.find().limit(<span style="color: rgba(128, 0, 0, 1); font-weight: bold">10</span>)</pre>
</div>
<p>&nbsp;</p>
<p>14、排序</p>
<table style="height: 66px; width: 296px" border="0">
<tbody>
<tr>
<td style="text-align: center">MySQL</td>
<td style="text-align: center">MongoDB</td>
<td style="text-align: center">说明</td>
</tr>
<tr>
<td style="text-align: center">asc</td>
<td style="text-align: center">1</td>
<td style="text-align: center">升序</td>
</tr>
<tr>
<td style="text-align: center">desc</td>
<td style="text-align: center">-1</td>
<td style="text-align: center">降序</td>
</tr>
</tbody>
</table>
<p><br><br></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">order</span> <span style="color: rgba(0, 0, 255, 1)">by</span> age <span style="color: rgba(0, 0, 255, 1)">asc</span><span style="color: rgba(0, 0, 0, 1)">;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">.find().sort(
    {age: </span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">1</span><span style="color: rgba(0, 0, 0, 1)">}
)</span></pre>
</div>
<p>&nbsp;</p>
<p>说明:mongo字符串类型的也可以排序</p>
<p>15、求和<br>直接累加求和某一项<br>比如下例对年龄进行求和</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(255, 0, 255, 1)">sum</span>(age) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span><span style="color: rgba(0, 0, 0, 1)">;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    {
      $group:
      {
            _id: null,
            total: {
                $sum: "$age"
            }
      }
    }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>分组求和<br>下例为按类型分组并求和</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> type,<span style="color: rgba(255, 0, 255, 1)">sum</span>(age) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">group</span> <span style="color: rgba(0, 0, 255, 1)">by</span><span style="color: rgba(0, 0, 0, 1)"> type;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    {
      $group:
      {
            _id: "$type",
            total: {
                $sum: "$age"
            }
      }
    }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>多条件分组求和<br>下例为按多个条件进行分组并求和</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> type,sex,<span style="color: rgba(255, 0, 255, 1)">sum</span>(age) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">group</span> <span style="color: rgba(0, 0, 255, 1)">by</span><span style="color: rgba(0, 0, 0, 1)"> type,sex;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    {
      $group: {
            _id:{
                type: "$type",
                sex: "$sex"
            },
            total: {
                $sum: "$age"
            }
      }
    }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>16、分组后having<br>下例为按条件分组并筛选出求和后大于100的数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> type, <span style="color: rgba(255, 0, 255, 1)">sum</span>(age) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">group</span> <span style="color: rgba(0, 0, 255, 1)">by</span> type <span style="color: rgba(0, 0, 255, 1)">having</span> total <span style="color: rgba(128, 128, 128, 1)">&gt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">100</span><span style="color: rgba(0, 0, 0, 1)">;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    {
      $group:
      {
            _id: "$type",
            total: {
                $sum: "$age"
            }
      }
    },
    {
      $match: {
            total: {
                $gt: 100
            }
      }
    }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>17、条件分组<br>类似mysql的where+group by进行查询<br>下例为查找出2020-01-01(timestamp:1577808000)后注册的用户,并按类型分组求和</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> type,<span style="color: rgba(255, 0, 255, 1)">sum</span>(age) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> created <span style="color: rgba(128, 128, 128, 1)">&gt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1577808000</span> <span style="color: rgba(0, 0, 255, 1)">group</span> <span style="color: rgba(0, 0, 255, 1)">by</span><span style="color: rgba(0, 0, 0, 1)"> type;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    {
      $match: {
         created: { $gt: 1577808000 }
         }
    },
    {
         $group: {
            _id: "$type",
            total: { $sum: "$age" }
         }
       }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>条件分组并having筛选<br>下例为查找出2020-01-01(timestamp:1577808000)后注册的用户,并按类型分组,同时筛选出大于100的数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> type,<span style="color: rgba(255, 0, 255, 1)">sum</span>(age) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">where</span> created <span style="color: rgba(128, 128, 128, 1)">&gt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1577808000</span> <span style="color: rgba(0, 0, 255, 1)">group</span> <span style="color: rgba(0, 0, 255, 1)">by</span> type <span style="color: rgba(0, 0, 255, 1)">having</span> total <span style="color: rgba(128, 128, 128, 1)">&gt;</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold">100</span><span style="color: rgba(0, 0, 0, 1)">;
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    {
         $match: {
               created: { $gt: 1577808000 }
          }
       },
       {
         $group: {
            _id: "$type",
            total: { $sum: "$age" }
         }
       },
       {
          $match: {
            total: { $gt: 100 }
          }
       }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>18、unwind<br>加入你的mongo的每一条记录有一个字段,存的是一个数组,数组里面是对象,类似这样,article字段含有</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    { "uid" : 1, "title" : "XXX", "content" : "XXX", "views" : 10 },
    { "uid" : 2, "title" : "XXX", "content" : "XXX", "views" : 11 },
    { "uid" : 3, "title" : "XXX", "content" : "XXX", "views" : 12 }
</span><span style="color: rgba(255, 0, 0, 1)">]</span></pre>
</div>
<p>&nbsp;</p>
<p>使用unwind可以使上面原本一条记录进行展开,分为三条数据进行展示,有点像mysql的join查询,只不过mysql得分开两个表存</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(128, 128, 128, 1)">*</span> <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">as</span> u <span style="color: rgba(128, 128, 128, 1)">left</span> <span style="color: rgba(128, 128, 128, 1)">join</span> article <span style="color: rgba(0, 0, 255, 1)">as</span> a <span style="color: rgba(0, 0, 255, 1)">on</span> (u.id<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(0, 0, 0, 1)">a.uid);
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
   { $unwind: "$article" }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>unwind后求和</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(255, 0, 255, 1)">sum</span>(views) <span style="color: rgba(0, 0, 255, 1)">as</span> total <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">as</span> u <span style="color: rgba(128, 128, 128, 1)">left</span> <span style="color: rgba(128, 128, 128, 1)">join</span> article <span style="color: rgba(0, 0, 255, 1)">as</span> a <span style="color: rgba(0, 0, 255, 1)">on</span> (u.id<span style="color: rgba(128, 128, 128, 1)">=</span>a.uid)) <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> data
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">

    { $unwind: "$article" },
    {
      $group: {
            _id: null,
            total: { $sum: "$article.views" }
         }
       }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>19、分组后统计总共有多少组<br>下例分按类型分组,并统计总数</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mysql:
</span><span style="color: rgba(0, 0, 255, 1)">select</span> <span style="color: rgba(255, 0, 255, 1)">count</span>(<span style="color: rgba(128, 128, 128, 1)">*</span>) <span style="color: rgba(0, 0, 255, 1)">from</span> (<span style="color: rgba(0, 0, 255, 1)">select</span> type <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(255, 0, 255, 1)">user</span> <span style="color: rgba(0, 0, 255, 1)">group</span> <span style="color: rgba(0, 0, 255, 1)">by</span><span style="color: rgba(0, 0, 0, 1)"> type);
mongo:
db.</span><span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
       {
         $group: {
            _id: "$type"
      }
    },
    {
      $group:
         {
            _id : null,
            count: { $sum: 1 }
         }
       }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p>&nbsp;</p>
<p>20、aggregate类型linux的grep指令,像管道处理一样,一级接一级,比如:筛选、分组、过滤等,最后返回结果</p>
<div class="cnblogs_code">
<pre>db.<span style="color: rgba(255, 0, 255, 1)">user</span>.aggregate(<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">
    { $match: { sex: "boy" } },
       { $group: { _id: "$type", total: { $sum: "$age" } } }
</span><span style="color: rgba(255, 0, 0, 1)">]</span>)</pre>
</div>
<p><img src="https://img2018.cnblogs.com/i-beta/1356274/202001/1356274-20200106195845622-1051182807.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>未完。。。</p><br><br>
来源:https://www.cnblogs.com/lyc94620/p/12148882.html
頁: [1]
查看完整版本: MySQL与MongoDB查询互转