如何用MongoDB聚合管道将匹配的嵌套邀请元素提至顶层?
解决方法
你需要通过几个聚合阶段实现嵌套字段提取和结构转换,具体管道步骤如下:
- $match:先筛选出包含目标用户邀请记录的群组文档(注意字段名大小写,你原代码里写的
recipientAccountID和文档结构里的recipientAccountId不一致,需要修正) - $unwind:将
invites数组拆分为单个文档,每个数组元素对应一条独立的聚合结果 - $match:再次过滤,只保留当前邀请记录中收件人是目标用户的条目(避免保留同群组内其他用户的邀请)
- $project:重构文档结构,将原文档
_id重命名为groupId,并保留senderAccountId和recipientAccountId
完整聚合代码:
db.groups.aggregate([ // 筛选存在目标用户邀请的群组 { $match: { "invites.recipientAccountId": "<user-id>" } }, // 拆分invites数组为单个文档 { $unwind: "$invites" }, // 仅保留目标用户作为收件人的邀请记录 { $match: { "invites.recipientAccountId": "<user-id>" } }, // 投影成需要的顶层结构 { $project: { _id: 0, groupId: "$_id", senderAccountId: "$invites.senderAccountId", recipientAccountId: "$invites.recipientAccountId" } } ])
执行后会得到符合需求的结果数组,示例如下:
[ { "groupId": "g123", "senderAccountId": "a456", "recipientAccountId": "<user-id>" }, // 其他符合条件的邀请记录 ]
内容的提问来源于stack exchange,提问作者Diego ROJAS
相关产品推荐
相关产品推荐

