【问题标题】:How to lookup with deep level in mongoDB? deep >2如何在 mongoDB 中进行深层查找?深 >2
【发布时间】:2020-09-19 22:59:50
【问题描述】:

我有三个系列: ServiceCate 存储有关 HairSalon 内部服务的信息

ServiceCate

{
    "_id" : ObjectId("5f64cb4d11eaeaf154047d30"),
    "serviceCode" : NumberLong(2),
    "serviceName" : "Take earwax"
}
{
    "_id" : ObjectId("5f64cb9511eaeaf154047deb"),
    "serviceCode" : NumberLong(3),
    "serviceName" : "Shampoo"
}
{
    "_id" : ObjectId("5f64cbec11eaeaf154047eb3"),
    "serviceCode" : NumberLong(4),
    "serviceName" : "Haircuts"
}

收款商店付款信息。

付款

{
    "_id" : ObjectId("5f64cd8611eaeaf15404825a"),
    "paymentCode" : NumberLong(10),
    "customerCode" : "2000000001",
    "orderNumber" : "TT20000001",
    "date" : ISODate("2020-06-01T00:07:00.000Z"),
    "staffCode" : NumberLong(3)
}
{
    "_id" : ObjectId("5f64cdc011eaeaf1540482ea"),
    "paymentCode" : NumberLong(11),
    "customerCode" : "2000000002",
    "orderNumber" : "TT20000002",
    "date" : ISODate("2020-06-01T00:07:00.000Z"),
    "staffCode" : NumberLong(3)
}
{
    "_id" : ObjectId("5f64ce0111eaeaf15404837c"),
    "paymentCode" : NumberLong(12),
    "customerCode" : "2000000003",
    "orderNumber" : "TT20000003",
    "date" : ISODate("2020-06-01T00:07:00.000Z"),
    "staffCode" : NumberLong(4)
}

PaymentDetails 存储有关每项服务(理发、洗发水……)的详细付款的所有信息

付款详情

{
    "_id" : ObjectId("5f64cea611eaeaf154048508"),
    "paymentDetailCode" : NumberLong(1),
    "paymentCode" : NumberLong(10),
    "serviceCode" : NumberLong(2),
    "money" : "180000.0"
}

{
    "_id" : ObjectId("5f64cfed11eaeaf154048897"),
    "paymentDetailCode" : NumberLong(20),
    "paymentCode" : NumberLong(10),
    "serviceCode" : NumberLong(3),
    "money" : "180000.0"
}
{
    "_id" : ObjectId("5f64d2c311eaeaf154048fea"),
    "paymentDetailCode" : NumberLong(20),
    "paymentCode" : NumberLong(10),
    "serviceCode" : NumberLong(4),
    "money" : "180000.0"
}

我想获得一个订单号(一个人)的付款,并详细支付美发沙龙服务(如理发、三宝、取耳垢)的费用,我喜欢下面。

db.Payments.aggregate([
{
    $match: {
       $and:[{"orderNumber": "TT20000001"}]
    }
},
{
  $lookup: {
    from: "PaymentDetails",
    localField: "paymentCode",
    foreignField: "paymentCode",
    as: "PaymentDetails"
  }
},
// {
//   $lookup: {
//     from: "ServiceCate",
//     localField: "PaymentDetails.serviceCode",
//     foreignField: "serviceCode",
//     as: "PaymentDetails.serviceCode",
//   }
// },
     
]);

下面是我的结果:

{
    "_id" : ObjectId("5f64cd8611eaeaf15404825a"),
    "paymentCode" : NumberLong(10),
    "customerCode" : "2000000001",
    "orderNumber" : "TT20000001",
    "date" : ISODate("2020-06-01T00:07:00.000Z"),
    "staffCode" : NumberLong(3),
    "PaymentDetails" : [ 
        {
            "_id" : ObjectId("5f64cea611eaeaf154048508"),
            "paymentDetailCode" : NumberLong(1),
            "paymentCode" : NumberLong(10),
            "serviceCode" : NumberLong(2), // I want to populate this field
            "money" : "180000.0"
        }, 
        {
            "_id" : ObjectId("5f64cfed11eaeaf154048897"),
            "paymentDetailCode" : NumberLong(20),
            "paymentCode" : NumberLong(10),
            "serviceCode" : NumberLong(3),// I want to populate this field
            "money" : "180000.0"
        }, 
        {
            "_id" : ObjectId("5f64d2c311eaeaf154048fea"),
            "paymentDetailCode" : NumberLong(20),
            "paymentCode" : NumberLong(10),
            "serviceCode" : NumberLong(4),// I want to populate this field
            "money" : "180000.0"
        }
    ]
}

我想填充“serviceCode”字段以获取详细信息服务,我添加了此代码但它不起作用。

 {
   $lookup: {
     from: "ServiceCate",
     localField: "PaymentDetails.serviceCode",
     foreignField: "serviceCode",
     as: "PaymentDetails.serviceCode",
   }
 }

我多次尝试使用谷歌搜索。我还发现这个链接enter link description here 可能看起来像我的问题,我已经尝试但无法正常工作。请帮我检查一下。非常感谢你

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework nodes


    【解决方案1】:

    此处需要进行 2 级查找。此查询将获取 ServiceCate 详细信息:

    db.Payments.aggregate([
       {
          "$match": {
             orderNumber: "TT20000001"
          }
       },
       {
          "$lookup": {
             "from": "PaymentDetails",
             "let": {
                "pCode": "$paymentCode"
             },
             "pipeline": [
                {
                   "$match": {
                      "$expr": {
                         "$eq": [
                            "$paymentCode",
                            "$$pCode"
                         ]
                      }
                   }
                },
                {
                   "$lookup": {
                      "from": "ServiceCate",
                      "let": {
                         "sCode": "$serviceCode"
                      },
                      "pipeline": [
                         {
                            "$match": {
                               "$expr": {
                                  "$eq": [
                                     "$serviceCode",
                                     "$$sCode"
                                  ]
                               }
                            }
                         }
                      ],
                      "as": "ServiceCate"
                   }
                }
             ],
             "as": "PaymentDetails"
          }
       }
    ]).pretty();
    

    这是输出:

    {
        "_id" : ObjectId("5f64e9e92240b900afe16fc7"),
        "paymentCode" : NumberLong(10),
        "customerCode" : "2000000001",
        "orderNumber" : "TT20000001",
        "date" : ISODate("2020-06-01T00:07:00Z"),
        "staffCode" : NumberLong(3),
        "PaymentDetails" : [
            {
                "_id" : ObjectId("5f64eaed2240b900afe16fc8"),
                "paymentDetailCode" : NumberLong(1),
                "paymentCode" : NumberLong(10),
                "serviceCode" : NumberLong(2),
                "money" : "180000.0",
                "ServiceCate" : [
                    {
                        "_id" : ObjectId("5f64e8f82240b900afe16fc2"),
                        "serviceCode" : NumberLong(2),
                        "serviceName" : "Take earwax"
                    }
                ]
            },
            {
                "_id" : ObjectId("5f64eb431476f6ad01ecbb44"),
                "paymentDetailCode" : NumberLong(20),
                "paymentCode" : NumberLong(10),
                "serviceCode" : NumberLong(3),
                "money" : "180000.0",
                "ServiceCate" : [
                    {
                        "_id" : ObjectId("5f64e94a1476f6ad01ecbb40"),
                        "serviceCode" : NumberLong(3),
                        "serviceName" : "Shampoo"
                    }
                ]
            },
            {
                "_id" : ObjectId("5f64eb541476f6ad01ecbb45"),
                "paymentDetailCode" : NumberLong(20),
                "paymentCode" : NumberLong(10),
                "serviceCode" : NumberLong(4),
                "money" : "180000.0",
                "ServiceCate" : [
                    {
                        "_id" : ObjectId("5f64e9581476f6ad01ecbb41"),
                        "serviceCode" : NumberLong(4),
                        "serviceName" : "Haircuts"
                    }
                ]
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 2018-05-14
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2021-11-07
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多