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

MongoDB如何查询双层嵌套数组cohortsGroups匹配用户cohort集合的文档

解决方案

该需求可以直接通过MongoDB原生查询实现,无需额外数据处理,核心使用$expr配合数组操作符完成校验,具体实现步骤如下:

步骤1:提取用户cohort的ID数组

首先从用户的cohortsRef中提取所有_id组成数组,注意保持和Event文档中_id的类型一致(如果是ObjectId类型不要转成字符串):

// 示例,根据实际存储类型调整
const userCohortIds = user.cohortsRef.map(item => item._id)

步骤2:执行查询

直接调用find方法,查询条件如下:

Events.find({
  $expr: {
    $anyElementTrue: {
      $map: {
        input: "$cohortsGroups",
        as: "group",
        in: {
          $setIsSubset: [
            // 提取当前cohort子组的所有_id
            { $map: { input: "$$group", as: "cohort", in: "$$cohort._id" } },
            // 传入用户的cohort id数组
            userCohortIds
          ]
        }
      }
    }
  }
})

逻辑说明

  • 外层$map遍历cohortsGroups下的每一个cohort子数组
  • 内层$map提取单个子数组中所有cohort的_id,组成纯ID数组
  • $setIsSubset判断该子数组的ID集合是否是用户ID集合的子集,即子数组中所有ID都存在于用户的ID列表中
  • $anyElementTrue只要存在任意一个满足条件的子数组,就返回该Event文档

注意事项

如果Event文档中cohort的_id为MongoDB原生ObjectId类型,提取用户ID数组时需保持类型为ObjectId,避免类型不匹配导致查询失效。


内容的提问来源于stack exchange,提问作者Arthur Gamblin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:48:01