MongoDB高级查询 「爱情、让人受尽委屈。」 2021-07-04 18:37 485阅读 0赞 # MongoDB 高级查询 # ## MongoDB 聚合管道 ## 使用聚合管道可以对集合中的文档进行变换和组合 实际运用:表关联查询、数据的统计 `MongoDB` 中使用 `db.COLLECTION_NAME.aggregate([{},...])` 方法来构建和使用聚合管道 ## Aggregation Pipeline Stages & Operators ## ### Stages 操作 ### <table> <thead> <tr> <th>操作符 S</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><code>$project</code></td> <td>修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档</td> </tr> <tr> <td><code>$match</code></td> <td>用于过滤数据,只输出符合条件的文档。<code>$match</code> 使用 MongoDB 的标准查询操作</td> </tr> <tr> <td><code>$limit</code></td> <td>用来限制 MongoDB 聚合管道返回的文档数</td> </tr> <tr> <td><code>$skip</code></td> <td>在聚合管道中跳过指定数量的文档,并返回余下的文档</td> </tr> <tr> <td><code>$group</code></td> <td>将集合中的文档分组,可用于统计结果</td> </tr> <tr> <td><code>$sort</code></td> <td>将输入文档排序后输出</td> </tr> <tr> <td><code>$lookup</code></td> <td>用以引入其它集合的数据 (表关联查询)</td> </tr> </tbody> </table> ### Operators 运算符 ### <table> <thead> <tr> <th align="left">Operators</th> <th align="left">描述</th> </tr> </thead> <tbody> <tr> <td align="left"><code>$sum</code></td> <td align="left">计算总和</td> </tr> <tr> <td align="left"><code>$avg</code></td> <td align="left">计算平均值</td> </tr> <tr> <td align="left"><code>$min</code></td> <td align="left">获取集合中所有文档对应值得最小值</td> </tr> <tr> <td align="left"><code>$max</code></td> <td align="left">获取集合中所有文档对应值得最大值</td> </tr> <tr> <td align="left"><code>$push</code></td> <td align="left">在结果文档中插入值到一个数组中</td> </tr> <tr> <td align="left"><code>$addToSet</code></td> <td align="left">在结果文档中插入值到一个数组中,但不创建副本</td> </tr> <tr> <td align="left"><code>$first</code></td> <td align="left">根据资源文档的排序获取第一个文档数据</td> </tr> <tr> <td align="left"><code>$last</code></td> <td align="left">根据资源文档的排序获取最后一个文档数据</td> </tr> </tbody> </table> > 管道操作符作为**键**,所对应的**值**叫做管道表达式 > 例如`{$match:{status:"A"}}`,`$match` 称为管道操作符,而 `status:"A"`称为管道表达式 > 每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的 ## 数据模拟 ## db.order.insert({ "order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) db.order.insert({ "order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) db.order.insert({ "order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6}) db.order_item.insert({ "order_id":"1","title":"商品鼠标 1","price":50,num:1}) db.order_item.insert({ "order_id":"1","title":"商品键盘 2","price":50,num:1}) db.order_item.insert({ "order_id":"1","title":"商品键盘 3","price":0,num:1}) db.order_item.insert({ "order_id":"2","title":"牛奶","price":50,num:1}) db.order_item.insert({ "order_id":"2","title":"酸奶","price":40,num:1}) db.order_item.insert({ "order_id":"3","title":"矿泉水","price":2,num:5}) db.order_item.insert({ "order_id":"3","title":"毛巾","price":10,num:1}) ## $project ## 自定义文档的结构,可以用来重命名、增加或删除文档中的字段 查找 order 只返回文档中 trade\_no 和 all\_price 字段 db.order.aggregate([ { $project: { trade_no: 1, all_price: 1 } } ]) ## $match ## 过滤。用法类似于 `find()` 方法中的参数 db.order.aggregate([ { $project: { trade_no: 1, all_price: 1 } }, { $match: { all_price: { $gte: 90 } } } ]) ## $group ## 分组,可用于统计结果 db.order_item.aggregate([ { $group: { _id: '$order_id', total: { $sum: '$num' } } } ]) ## $sort ## 排序 db.order.aggregate([ { $project: { trade_no: 1, all_price: 1 } }, { $sort: { all_price: -1 } } ]) ## $limit ## 限制数量 db.order.aggregate([ { $project: { trade_no: 1, all_price: 1 } }, { $limit: 1 } ]) ## $skip ## 跳过 db.order.aggregate([ { $project: { trade_no: 1, all_price: 1 } }, { $skip: 1 } ]) ## $lookup ## 表关联 db.order.aggregate([ { $lookup: { from: 'order_item', localField: 'order_id', foreignField: 'order_id', as: 'items' } } ]) ## 综合运用 ## db.order.aggregate([ { $lookup: { from: 'order_item', localField: 'order_id', foreignField: 'order_id', as: 'items' } }, { $match: { all_price: { $gt: 90 } } }, { $project: { items: 1 } } ])
还没有评论,来说两句吧...