MongoDB 聚合嵌入的数组(扁平化数据+管道)
先看下要操作的主要数据结构:
{
"_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0",
"evaluation_type" : 2,
"reply_count" : 5,
"type" : 3,
"content" : "怎么编制余额调节表",
"tips" : [
{
"_id" : 1000,
"tip_name" : "会计基础"
}
],
"teach_id" : 10298153
}
看这个文档数据,现在要以 tips 数组下的 _id 做数据的分组查询。在查询条件中使用 "tips.0._id":1000 过滤数据是可以生效的,但用在 aggregate 聚合查询中的 group 分组条件中是不行的,必须得先使用 $unwind (文档地址)把 tips 这个数组对象变成扁平的结构(把数组中的每个对象拆分出来与当前文档重新组合,达到消数组的效果)
上面数据根据以下查询语句的前后变化
扁平化前:
db.getCollection('topics').find({"teach_id":10010943})
扁平化后:
db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'})
关注扁平化前后 tips 由数组变成了对象
通过 {'$unwind' : '$tips'} 对文档扁平化结构之后,然后再用 pipeline (管道)的方式做聚合就好了,
可以直接根据 tips._id 进行分组了
查询语句:
db.getCollection('topics').aggregate({'$match':{"teach_id":10010943}},{'$unwind':'$tips'},
{'$group':{'_id':{"tipId":'$tips._id',"tipName":'$tips.tip_name',"evaluationType":'$evaluation_type'},"count":{'$sum': 1}}},
{'$project':{"tipId":'$_id.tipId',"tipName":'$_id.tipName',"evaluationType":'$_id.evaluationType',"count":'$count'}})
完美滴根据 tipId,tipName,evaluationType 分好组了
关注公众号,分享干货,讨论技术
分类:
Mongodb
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!