【问题标题】:Mongodb lookup with array使用数组查找MongoDB
【发布时间】:2020-11-25 17:52:30
【问题描述】:

我有两个收藏第一个是

user_profile 集合

const userProfileSchema = mongoose.Schema({
  
  phone_number: {
    type: String,
    required: false,
  },
  primary_skills: [
    {
      skill_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Skill'
      },
      years: Number,
    }
  ]
});

样本数据

{
  "phone_number":"222",
   "primary_skills":[{skill_id:1,years:12},{skill_id:2,years:13}]
}

primary_skills 中,键skill_id 与另一个名为skills 的集合映射

技能集合

const skillSchema = mongoose.Schema({
  name: {
    type: String,
    required: true,
    unique:true,
  },
});

样本数据

[
   {
   id:1,
   name:'php'
   },
  {
   id:2,
   name:'java'
  }
]

我想获取 user_profile 集合中的所有值以及相应的 skills 名称

预期输出:

{
 "phone_number":"222",
 "primary_skills":[{
    name:"php",skill_id:1,years:12
 },{
  name:"java",skill_id:2,years:13}
]
}

我发现了一个与我的问题 MongoDB lookup when foreign field is an array of objects 类似的线程,但它与我想要的相反

这是我试过的查询

profile.aggregate([{
     $lookup:{
        from:'skills',
        localField:'primary_skills.skill_id',
        foreignField:'_id',
        'as':'primary_skills'
      }
   
}])

这很好用,但它不包含years

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您需要使用$unwind$group 进行操作,

    • $unwind primary_skills 因为它是一个数组,我们需要明智地查找子文档
    db.user_profile.aggregate([
      {
        $unwind: "$primary_skills"
      },
    
    • $lookup 加入 primary_skills,你已经这样做了
      {
        $lookup: {
          from: "skills",
          localField: "primary_skills.skill_id",
          foreignField: "id",
          as: "primary_skills.name"
        }
      },
    
    • $unwind primary_skills.name 我们已经存储了连接结果,它的数组,我们正在展开做对象
      {
        $unwind: {
          path: "$primary_skills.name"
        }
      },
    
    • $addFields 替换字段 name 我们有对象,我们只需要名称
      {
        $addFields: {
          "primary_skills.name": "$primary_skills.name.name"
        }
      },
    
    • $group by _id 因为我们已经展开,我们需要合并所有文档
      {
        $group: {
          _id: "$_id",
          phone_number: {
            $first: "$phone_number"
          },
          primary_skills: {
            $push: "$primary_skills"
          }
        }
      }
    ])
    

    游乐场:https://mongoplayground.net/p/bDmrOwmASn5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2022-01-21
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多