【问题标题】:How to make a nested relationship on mongodb?如何在mongodb上建立嵌套关系?
【发布时间】:2021-05-19 09:07:08
【问题描述】:

例如,我有 4 个集合。有:

  1. “公司”集合
{
 "id_company": "C01"
 "company_name": "Sidomuncul"
 "like": [
  "123",
  "121"
 ]
}

  1. “用户”集合
{
  "id_user": "123",
  "name": "Astra",
  "major": "111",
  "language": [{
     "id_language": "101",
     "level": "Expert"
  }]
},
{
  "id_user": "121",
  "name": "Bibi",
  "id_major": "112",
  "language": [{
     "id_language": "102",
     "level": "Intermediate"
  }]
}
  1. “主要”合集
{
   "id_major": "111",
   "name": "IT" 
},
{
   "id_major": "112",
   "name": "Designer" 
}
  1. “语言”集合
{
   "id_language": "101",
   "name": "English" 
},
{
   "id_language": "102",
   "name": "Chinese" 
}

当我通过 id_company "C01" 为获得类似公司的人创建路线时,我想在 "like" 字段中显示结果关系 id_user 和用户集合。示例结果:

{
   "id_company": C01",
   "like": [
    {
     "id_user": "123",
     "name": "Astra",
     "major": "IT",
     "language": [{
        "id_language": "English",
        "level": "Expert"
     }]
    },
    {
     "id_user": "121",
     "name": "Bibi",
     "id_major": "Designer",
     "language": [{
        "id_language": "Chinese",
        "level": "Intermediate"
     }]
     }
    ] //Close Like Field
}

之前谢谢。

【问题讨论】:

  • 用户集合中需要有外键引用公司集合进行join操作。阅读此处stackoverflow.com/questions/26008555/foreign-key-mongoose
  • 在你链接用户和公司集合后,执行一系列嵌套的$lookup操作来达到你的结果。对于嵌套的 $lookup,请阅读此处stackoverflow.com/questions/52712240/…。发布您的尝试,如果卡住了会帮助您。
  • 谢谢,我已经试过了。但是仍然没有工作。当我查找另一个集合时,用户之前的数据没有显示

标签: node.js mongodb mongoose


【解决方案1】:

使用Mongo aggregate pipeline,您可以在多个阶段收集所需的结果。对于 mongo 聚合查询,您可以使用 $lookup$set$unwind$group 阶段。试试这个查询,你可能会得到所需的结果集:

db.company.aggregate([
  {
    "$unwind": "$like"
  },
  {
    $lookup: {
      from: "user",
      localField: "like",
      foreignField: "id_user",
      as: "like"
    }
  },
  {
    "$unwind": "$like"
  },
  {
    $lookup: {
      from: "major",
      localField: "like.major",
      foreignField: "id_major",
      as: "major"
    }
  },
  {
    "$unwind": "$major"
  },
  {
    $set: {
      "like.major": "$major.name"
    }
  },
  {
    $lookup: {
      from: "language",
      localField: "like.language.id_language",
      foreignField: "id_language",
      as: "lang"
    }
  },
  {
    "$unwind": "$lang"
  },
  {
    $set: {
      "like.language.id_language": "$lang.name"
    }
  },
  {
    $group: {
      _id: "id_company",
      company_name: {
        "$first": "$company_name"
      },
      like: {
        $push: {
          id_user: "$like.id_user",
          major: "$like.major",
          name: "$like.name",
          language: "$like.language"
        }
      }
    }
  }
])

【讨论】:

    【解决方案2】:

    已解决

    使用查找和分组也推送

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多