如何在mongoDB中使用深层查找?深>;2.

如何在mongoDB中使用深层查找?深>;2.,mongodb,mongoose,mongodb-query,aggregation-framework,nodes,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,Nodes,我有三个收藏: ServiceCate存储有关美发沙龙内部服务的信息 ServiceCate: { "_id" : ObjectId("5f64cb4d11eaeaf154047d30"), "serviceCode" : NumberLong(2), "serviceName" : "Take earwax" } { "_id" : Objec

我有三个收藏: ServiceCate存储有关美发沙龙内部服务的信息

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)
}
付款收款存储付款信息

付款

{
    "_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"
}
我想获得一个订单号(一个人)的付款,以及发廊服务的详细付款(如理发、Sampo、取耳垢),我喜欢下面的内容

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",
   }
 }

我尝试了很多次谷歌搜索。我还发现这个链接似乎是我的问题,我已经尝试过了,但没有成功。请帮我查一下。非常感谢您

此处需要两级查找。此查询将获取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"
                }
            ]
        }
    ]
}