【发布时间】:2018-02-17 15:50:19
【问题描述】:
我有两个集合Employee、Client
Employee 架构有以下记录
{
"_id": ObjectId("5a852dcd0290f7eca89e9a79"),
"FirstName": "Nirav",
"LastName": "Modi",
"Gender": true,
"Forms": [{
"ClientId": ObjectId("5a8528ed0290f7eca89e9a5f"),
"ProjectId": ObjectId("5a856fde0290f7eca89e9a88"),
"FormId": ObjectId("5a62e561f6647f17f85e54c5")
}]
}
Client 架构有以下记录
{
"_id" : ObjectId("5a8528ed0290f7eca89e9a5f"),
"CompanyName" : "PNB",
"Projects" : [{
"_id" : ObjectId("5a856ca70290f7eca89e9a7f"),
"Name" : "House Loan",
"Description" : "Get house load",
"Forms" : []
}, {
"_id" : ObjectId("5a856fde0290f7eca89e9a88"),
"Name" : "Car Loan",
"Description" : "get car loan",
"Forms" : [
ObjectId("5a62e82299d9fe0a14a1ead5"),
ObjectId("5a6eec263bf43426d4d31780"),
ObjectId("5a62e561f6647f17f85e54c5")
]
}
]
}
在我的系统中,员工被分配了要处理的表单。如您所见,员工架构包含 Forms 字段,其中包含 ClientId、ProjectId、FormId。
表单可以在多个客户端中用于多个项目。
当我获取数据时,我希望输出如下所示
{
"_id": ObjectId("5a852dcd0290f7eca89e9a79"),
"FirstName": "Aartik",
"LastName": "Ladumor",
"Gender": true,
"Clients": [{
"_id": ObjectId("5a8528ed0290f7eca89e9a5f"),
"CompanyName": "PNB",
"Projects": [{
"_id": ObjectId("5a856fde0290f7eca89e9a88"),
"Name": "Car Loan",
"Description": "get car loan",
"Forms": [
ObjectId("5a62e82299d9fe0a14a1ead5"),
ObjectId("5a6eec263bf43426d4d31780"),
ObjectId("5a62e561f6647f17f85e54c5")
]
}
]
}
]
}
仅获取项目包含分配给员工的表单的客户。
为此我进行如下聚合
db.Employees.aggregate([{
$lookup: {
from: "Clients",
localField: "Forms.ClientId",
foreignField: "_id",
as: "Clients"
}
}, {
filter projects array in matched client contains only
projects that match Employee.Forms each elements
ProjectsId -> Client.Projects._id and
FormId -> in Client.Projects.Forms array containing forms ObjectId
}
]).pretty()
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework