有两个集合:
1。文件:
[{
"_id": {
"$oid": "5f44b6e334f74d606053003d"
},
"documentId": 9,
"name": "Project Charter 9",
"type": "Charter",
"status": {
"id": 2,
"name": "Submitted"
}....
]
}]
2。状态主题
[{"_id":{"$oid":"5f8481b2bd39674a909a9c53"},"id":0,"color":"Black"}]
我想获取每种状态的颜色。
所需的输出:
{
"totalDocCount": [
{
"_id": {
"Status": {
"_id": 0,
"name": "Total Documents",
"Color": "Black"
}
},
"count": 10
}
],
"countByStatus": [
{
"_id": {
"Status": {
"id": 1,
"name": "Draft"
},
"Color": "Grey"
},
"count": 1
},
{
"_id": {
"Status": {
"id": 2,
"name": "Submitted"
},
"Color": "Blue"
},
"count": 6
},
{
"_id": {
"Status": {
"id": 3,
"name": "Approved"
},
"Color": "Green"
},
"count": 2
},
{
"_id": {
"Status": {
"id": 4,
"name": "Rejected"
},
"Color": "Red"
},
"count": 1
}
]
}
我想出了一个可行的解决方案。但这是一个糟糕的糟糕解决方案。
db.Documents.aggregate([
{
"$lookup": {
from: "StatusTheme",
localField: "id",
foreignField: "status.id",
as: "statusColorMapping"
}
},
{
"$facet": {
"totalDocCount": [
{
"$group": {
"_id": {
"Status": {
"_id": 0,
"name": "Total Documents",
"Color": {
"$arrayElemAt": [
"$statusColorMapping.color",
0
]
}
}
},
"count": {
"$sum": 1
}
}
}
],
"countByStatus": [
{
"$group": {
"_id": {
"Status": "$status",
"Color": {
"$arrayElemAt": [
"$statusColorMapping.color",
"$status.id"
]
}
},
"count": {
"$sum": 1
},
}
},
{
$sort: {
_id: 1
}
}
]
}
}
])
如您所见,我利用了状态ID从0开始的事实。我是"$arrayElemAt"
,从查询变量statusColorMapping
中获取第n个项目。
这里真正的解决方案是什么?
如果可能的话。我想尽可能避免任何变量。 (我有原因) 另外,我想在本地进行。而且以后不会通过JavaScript。