MongoDB聚合查询关联活动集合时如何新增用户是否注册标识字段
实现方案
你可以在group_events集合关联的pipeline中,关联完register_events之后新增一个$addFields阶段,配合$in操作符判断目标用户ID是否存在于报名列表中即可。
假设你要查询的目标用户ID为TARGET_USER_ID,修改后的完整聚合代码如下:
// 若集合中userId存储的是ObjectId类型,需要先做类型转换,字符串类型可直接赋值 const targetUserId = ObjectId("614d59371d11becb8e23f536"); Events.aggregate([ { $match: { category: "group_event" } }, { $lookup: { from: "group_events", let: { eventId: "$eventID" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$_id", "$$eventId"] }, { $gt: ["$time", new Date()] }, ], }, }, }, { $lookup: { from: "register_events", let: { eventId: "$_id" }, pipeline: [ { $match: { $expr: { $eq: ["$eventId", "$$eventId"] } } }, ], as: "registerUsers", }, }, // 新增字段计算用户报名状态 { $addFields: { isUserRegisted: { $in: [targetUserId, "$registerUsers.userId"] } } } ], as: "events", }, }, { $unwind: "$events" }, ])
原理解释
- MongoDB支持直接提取数组字段的子属性,
$registerUsers.userId会自动把报名列表中所有用户ID提取为一个新数组 $in操作符直接判断目标用户ID是否在这个提取出的数组中,返回布尔值就是你需要的报名状态标识,该字段会直接挂载在events对象下,符合你的输出结构要求
注意:如果
register_events集合中userId字段存储的是MongoDB ObjectId类型,传入的targetUserId必须先转换为对应类型,避免类型不一致导致匹配失败。
内容的提问来源于stack exchange,提问作者Dipta Biswa
相关产品推荐
相关产品推荐

