Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何在mongoose中聚合嵌套查找数组?_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Mongodb 如何在mongoose中聚合嵌套查找数组?

Mongodb 如何在mongoose中聚合嵌套查找数组?,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有一个如何查找嵌套数组的问题,例如,我有4个集合 用户集合 语言集合 工作 提交收藏 我的查询聚合是: db.cvsubmit.aggregate([ { $lookup: { from: "user", localField: "id_user", foreignField: "_id", as: "id_user" } }, {

我有一个如何查找嵌套数组的问题,例如,我有4个集合

  • 用户集合
  • 语言集合
  • 工作
  • 提交收藏
  • 我的查询聚合是:

    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游乐场连接线

    之前谢谢。

    • $lookup
      用户
      集合
    • $unwind
      解构
      id\u用户
      数组
    • $lookup
      使用
      语言
      收集并返回
      语言
      字段
    • $map
      迭代
      id\u user.language
      数组的外观
    • $reduce
      要迭代从集合返回的
      语言
      数组的循环,请检查条件
      语言id是否匹配,然后返回
      名称

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

    "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"
              }
            ]
          }
        }
      }
    ]
    
    [
      {
        "_id": "11",
        "id_job": "11",
        "id_user": {
          "_id": "1234",
          "name": "Tony"
          "language": [
              {
                "_id": "919",
                "name": "English",
                "Level": "Expert"
              },
              {
                "_id": "920",
                "name": "Chinese",
                "level": "Basic"
              }
            ]
        }
      }
    ]
    
    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"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    ])