【问题标题】:How to aggregate nested lookup array in mongoose?如何在猫鼬中聚合嵌套查找数组?
【发布时间】:2021-05-06 13:22:09
【问题描述】:

我对如何查找嵌套数组有疑问,例如我有 4 个集合。

  1. 用户收藏
"user": [
    {
      "_id": "1234",
      "name": "Tony",
      "language": [
        {
          "_id": "111",
          "language_id": "919",
          "level": "Expert"
        },
        {
          "_id": "111",
          "language_id": "920",
          "level": "Basic"
        }
      ]
    }
  ]
  1. 语言合集
"language": [
    {
      "_id": "919",
      "name": "English"
    },
    {
      "_id": "920",
      "name": "Chinese"
    }
  ]
  1. 工作
"job": [
    {
      "_id": "10",
      "title": "Programmer",
      "location": "New York"
    }
  ],
  1. 简历提交收藏
"cvsubmit": [
    {
      "_id": "11",
      "id_user": "1234",
      "id_job": "11"
    }
  ]

我的查询聚合是:

db.cvsubmit.aggregate([
  {
    $lookup: {
      from: "user",
      localField: "id_user",
      foreignField: "_id",
      as: "id_user"
    }
  },
  {
    $lookup: {
      from: "language",
      localField: "id_user.language.language_id",
      foreignField: "_id",
      as: "id_user.language.language_id"
    }
  },
])

但结果是:

[
  {
    "_id": "11",
    "id_job": "11",
    "id_user": {
      "language": {
        "language_id": [
          {
            "_id": "919",
            "name": "English"
          },
          {
            "_id": "920",
            "name": "Chinese"
          }
        ]
      }
    }
  }
]

我想要这样的结果,还显示所有用户数据详细信息,如name

[
  {
    "_id": "11",
    "id_job": "11",
    "id_user": {
      "_id": "1234",
      "name": "Tony"
      "language": [
          {
            "_id": "919",
            "name": "English",
            "Level": "Expert"
          },
          {
            "_id": "920",
            "name": "Chinese",
            "level": "Basic"
          }
        ]
    }
  }
]

Mongo Playground 链接https://mongoplayground.net/p/i0yCucjruey

之前谢谢。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:
    • $lookupuser 合集
    • $unwind解构id_user数组
    • $lookuplanguage 集合并在 languages 字段中返回
    • $map 迭代 id_user.language 数组的外观
    • $reduce 迭代从集合返回的 languages 数组的循环,检查条件如果 language_id 匹配则返回 name
    db.cvsubmit.aggregate([
      {
        $lookup: {
          from: "user",
          localField: "id_user",
          foreignField: "_id",
          as: "id_user"
        }
      },
      { $unwind: "$id_user" },
      {
        $lookup: {
          from: "language",
          localField: "id_user.language.language_id",
          foreignField: "_id",
          as: "languages"
        }
      },
      {
        $addFields: {
          languages: "$$REMOVE",
          "id_user.language": {
            $map: {
              input: "$id_user.language",
              as: "l",
              in: {
                _id: "$$l._id",
                level: "$$l.level",
                name: {
                  $reduce: {
                    input: "$languages",
                    initialValue: "",
                    in: {
                      $cond: [
                        { $eq: ["$$this._id", "$$l.language_id"] },
                        "$$this.name",
                        "$$value"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    ])
    

    Playground

    根据 NoSQL,您的数据库结构不准确,最多应该有 2 个集合,使用 $lookup 和 $unwind 进行连接的战利品会导致性能问题。

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 2021-10-17
      • 1970-01-01
      • 2020-05-10
      • 2015-08-21
      • 2022-01-26
      • 2023-01-30
      • 2019-07-20
      • 2020-12-18
      相关资源
      最近更新 更多