You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:45:03