如何解决如何在mongoDB中进行更深层次的查找?深度> 2
我有三个收藏: 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","staffCode" : NumberLong(3)
}
{
"_id" : ObjectId("5f64ce0111eaeaf15404837c"),"paymentCode" : NumberLong(12),"customerCode" : "2000000003","orderNumber" : "TT20000003","staffCode" : NumberLong(4)
}
并且PaymentDetails存储有关每个服务(理发,洗发水……)的详细付款的所有信息
付款明细
{
"_id" : ObjectId("5f64cea611eaeaf154048508"),"paymentDetailCode" : NumberLong(1),"money" : "180000.0"
}
{
"_id" : ObjectId("5f64cfed11eaeaf154048897"),"paymentDetailCode" : NumberLong(20),"money" : "180000.0"
}
{
"_id" : ObjectId("5f64d2c311eaeaf154048fea"),"money" : "180000.0"
}
我想获得一个订单号(一个人)的付款,并详细支付美发沙龙的服务费用(例如HairCut,Sampo,Take Earwax)。
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"),"staffCode" : NumberLong(3),"PaymentDetails" : [
{
"_id" : ObjectId("5f64cea611eaeaf154048508"),// I want to populate this field
"money" : "180000.0"
},{
"_id" : ObjectId("5f64cfed11eaeaf154048897"),{
"_id" : ObjectId("5f64d2c311eaeaf154048fea"),// I want to populate this field
"money" : "180000.0"
}
]
}
我想填充“ serviceCode”字段以获取详细信息服务,我已添加了此代码,但是它不起作用。
{
$lookup: {
from: "ServiceCate",localField: "PaymentDetails.serviceCode",foreignField: "serviceCode",as: "PaymentDetails.serviceCode",}
}
我尝试了很多次Google搜索。我还发现此链接enter link description here似乎是我的问题,我已经尝试过但无法正常工作。请帮我检查一下。非常感谢你
解决方法
此处需要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),"serviceCode" : NumberLong(2),"money" : "180000.0","ServiceCate" : [
{
"_id" : ObjectId("5f64e8f82240b900afe16fc2"),"serviceName" : "Take earwax"
}
]
},{
"_id" : ObjectId("5f64eb431476f6ad01ecbb44"),"paymentDetailCode" : NumberLong(20),"serviceCode" : NumberLong(3),"ServiceCate" : [
{
"_id" : ObjectId("5f64e94a1476f6ad01ecbb40"),"serviceName" : "Shampoo"
}
]
},{
"_id" : ObjectId("5f64eb541476f6ad01ecbb45"),"serviceCode" : NumberLong(4),"ServiceCate" : [
{
"_id" : ObjectId("5f64e9581476f6ad01ecbb41"),"serviceName" : "Haircuts"
}
]
}
]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。