【问题标题】:One to Many MongoDB lookup with project req fields带有项目请求字段的一对多 MongoDB 查找
【发布时间】:2021-06-23 08:59:13
【问题描述】:

我有两个集合的一对多关系,比如 A 到 B。我怎样才能在一个文档中为每个 id 显示所需的输出。 例如,我有

/*Collection A*/
{
    "a_Id": "abc",
        "name": "xyz",
        "age": 5
}       

...//其他文档

/*Collection B*/
{
    "b_id": "abc",
    "FeeAmount": 800000,
    "invoiceNumber": "A10",
    "Date": "2021-10-29T00:00:00.000+04:00",
    "PaidAmount": 200000
},
{
    "b_id": "abc",
    "FeeAmount": 90,
    "invoiceNumber": "A20",
    "Date": "2021-10-29T00:00:00.000+04:00",
    "PaidAmount": 20
}

//...其他 docs 多个不同的 id,例如 abc1,abc2

根据 id 查找后如何实现以下输出? 这是每个 id 一个文档。

    /*Desired OutPut*/
//Document 1
    {
       "name": "xyz",
        "age": 5
       "availableLimitAmount": 800000,
      "FeeAmount": 800000,
        "invoiceNumber": "A10",
        "Date": "2021-10-29T00:00:00.000+04:00",
        "PaidAmount": 200000
    },
    {
        "name": "xyz",
         "age": 5
        "FeeAmount": 90,
        "invoiceNumber": "A20",
        "Date": "2021-10-29T00:00:00.000+04:00",
        "PaidAmount": 20
    }
//Document 2
 {
       "name": "qwe",
        "age": 50
       "availableLimitAmount": 20000,
      "FeeAmount": 40000,
        "invoiceNumber": "B10",
        "Date": "2021-1-1T00:00:00.000+04:00",
        "PaidAmount": 1000
    },
    {
        "name": "qwe",
         "age": 50
        "FeeAmount": 40,
        "invoiceNumber": "B20",
        "Date": "2021-2-2T00:00:00.000+04:00",
        "PaidAmount": 500
    }

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework one-to-many mongodb-lookup


    【解决方案1】:
    1. 使用$lookup 运算符加入两个集合AB
    2. 执行$unwind 操作以“传播”结果。
    3. $project 随心所欲。

    所以试试这个:

    db.A.aggregate([
        {
            $lookup: {
                from: "B",
                localField: "a_Id",
                foreignField: "b_id",
                as: "B"
            }
        },
        { $unwind: "$B" },
        {
            $project: {
                "_id": 0,
                "name": "$name",
                "age": "$age",
                "FeeAmount": "$B.FeeAmount",
                "invoiceNumber": "$B.invoiceNumber",
                "Date": "$B.Date",
                "PaidAmount": "$B.PaidAmount",
            }
        }
    ]);
    

    【讨论】:

      【解决方案2】:

      这是一个working solution,告诉你如何实现这一目标。

      db.coll1.aggregate([
        {
          $lookup: {
            localField: "a_Id",
            from: "coll2",
            foreignField: "b_id",
            as: "data",
            
          }
        },
        {
          $unwind: "$data"
        },
        {
          $replaceRoot: {
            "newRoot": {
              "$mergeObjects": [
                "$$ROOT",
                "$data"
              ]
            }
          }
        },
        {
          $project: {
            "data": 0
          }
        }
      ])
      

      更新

      db.coll1.aggregate([
        {
          $lookup: {
            localField: "a_Id",
            from: "coll2",
            foreignField: "b_id",
            as: "data",
            
          }
        },
        {
          $unwind: "$data"
        },
        {
          $replaceRoot: {
            "newRoot": {
              "$mergeObjects": [
                "$$ROOT",
                "$data"
              ]
            }
          }
        },
        {
          $project: {
            "data": 0
          }
        },
        {
          $group: {
            _id: "$a_Id",
            data: {
              $push: "$$ROOT"
            }
          }
        }
      ])
      

      【讨论】:

      • 它再次给出多个文档的结果。我希望结果在同一个文档但不同的对象中。表示一个文档具有多个结果对象的一个​​ ID。更改 id 后的新文档,然后所有这些 id 结果再次加入一个文档,每个文档都有一个对象。
      • 请用所需的输出更新您的问题,就像您在上面的评论中试图解释的那样很难理解。
      • @Wajih 检查更新后的查询是否适合您。
      • 是的,它奏效了。谢谢你的时间。我很感激。
      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多