如何在mongoDB中使用深层查找?深>;2.
我有三个收藏: ServiceCate存储有关美发沙龙内部服务的信息 ServiceCate:如何在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
{
"_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"
}
]
}
]
}