mongo-05-聚合操作和索引

本文详细介绍了MongoDB的聚合操作,包括$project、$match、$limit、$skip、$unwind、$sort、$group和$out等阶段,并通过实例展示了它们的用法。同时,讨论了索引的创建、查看、删除和选项,如唯一性和稀疏性,以及如何使用explain()进行查询分析,优化查询性能。
摘要由CSDN通过智能技术生成

1. 聚合操作

db.<collection>.aggregate(<pipeline>,<options>)

<pipeline> 文档定义了操作中使用的聚合管道阶段和聚合操作符
<options> 文档声明了一些聚合操作的参数

介绍几种常见的表达式:

  1. 字段路径表达式
    $<field> : 使用 $ 来指示字段路径,例如: n a m e 表 示 用 户 名 字 段 ‘ name 表示用户名字段 ` name.` : 使用 $ 和 . 来指示内嵌文档字段路径

  2. 系统变量表达式
    $$<variable> : 使用 来 指 示 系 统 变 量 ‘ 来指示系统变量 ` CURRENT: 指示管道中当前操作的文档$ C U R R E N T . < f i e l d > ‘ 和 ‘ CURRENT.<field>` 和 ` CURRENT.<field>` 是等效的

  3. 常量表达式
    $literal: <value> : 指示常量 <value>
    $literal: "$name" : 指示常量字符串 “$name”,这里 $ 被当作常量处理,而不是字段路径表达式

聚合管道阶段

  • $project : 对输入的文档进行投影
  • $match : 对输入的文档进行过滤筛选
  • $limit : 筛选出管道内前N篇文档
  • $skip : 跳过管道内前N篇文档
  • $unwind : 展开输入文档中的数组字段
  • $sort : 对输入的文档进行排序
  • $lookup : 对输入的文档进行查询操作
  • $group : 对输入的文档进行分组
  • $out : 将管道中的文档输出

1.1 $project : 对输入的文档进行投影

$project是一个非常常用的聚合阶段,可以用来灵活地控制输出文档的格式,也可以用来剔除不相关的字段,以优化聚合管道操作的性能。

现在 user 集合的数据:

> db.user.find()
{ "_id" : "1", "money" : 1500, "name" : "刘一一", "gender" : "女" }
{ "_id" : "2", "money" : 1000, "name" : "陈二", "gender" : "女" }
{ "_id" : "3", "name" : "张三", "sal" : 1000, "gender" : "女" }
{ "_id" : "4", "money" : 800, "name" : "李四", "gender" : "女" }
{ "_id" : "5", "money" : 1000, "name" : "王五", "sal" : 500, "gender" : "女" }
{ "_id" : "6", "name" : "赵六", "money" : 1000 }
{ "_id" : "7", "money" : 1000, "name" : "孙七", "gender" : "女" }
{ "_id" : ObjectId("5fff6a78025e5d9ea86e18cc"), "money" : 1000, "name" : "周八", "gender" : "女" }
{ "_id" : { "age" : 18, "gender" : "男" }, "money" : 1000, "name" : "吴九", "gender" : "女" }
{ "_id" : ObjectId("5fff95783f6d5ed2fcce4133"), "money" : 2000, "name" : "ZHANG", "addr" : [ "三亚", "北京" ], "gender" : "女" }
{ "_id" : ObjectId("60045f5719414c7b5be4c122"), "name" : "富二代", "money" : 1500 }
{ "_id" : ObjectId("6004611c19414c7b5be4c13f"), "name" : "打工人", "money" : 800 }
> 

只投影name 和 money 字段

> db.user.aggregate([{$project: {_id:0, name: 1, money: 1}}])
{ "money" : 1500, "name" : "刘一一" }
{ "money" : 1000, "name" : "陈二" }
{ "name" : "张三" }
{ "money" : 800, "name" : "李四" }
{ "money" : 1000, "name" : "王五" }
{ "name" : "赵六", "money" : 1000 }
{ "money" : 1000, "name" : "孙七" }
{ "money" : 1000, "name" : "周八" }
{ "money" : 1000, "name" : "吴九" }
{ "money" : 2000, "name" : "ZHANG" }
{ "name" : "富二代", "money" : 1500 }
{ "name" : "打工人", "money" : 800 }
> 

在返回结果中对投影的字段设置别名,将 _id 设置别名 “主键”

> db.user.aggregate([{$project: {_id:0, name: 1, money: 1, 主键: "$_id"}}])
{ "money" : 1500, "name" : "刘一一", "主键" : "1" }
{ "money" : 1000, "name" : "陈二", "主键" : "2" }
{ "name" : "张三", "主键" : "3" }
{ "money" : 800, "name" : "李四", "主键" : "4" }
{ "money" : 1000, "name" : "王五", "主键" : "5" }
{ "name" : "赵六", "money" : 1000, "主键" : "6" }
{ "money" : 1000, "name" : "孙七", "主键" : "7" }
{ "money" : 1000, "name" : "周八", "主键" : ObjectId("5fff6a78025e5d9ea86e18cc") }
{ "money" : 1000, "name" : "吴九", "主键" : { "age" : 18, "gender" : "男" } }
{ "money" : 2000, "name" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值