mongodb - 用于嵌套分组的 MongoDB 查询
问题描述
我有 3 个收藏:
- 计划
- 业务流程
- 恢复策略
他们三个将他们的主键存储在_id
和
我有另一个收藏:planRecoveryStrategy
哪些商店
planId
businessProcessId
recoveryStrategyId
存储在的示例文档planRecoveryStrategy
:
{ "planId" : "PLN1",
"processId" : "PCS1",
"strategyId" : "RES1"
}
{ "planId" : "PLN1",
"processId" : "PCS2",
"strategyId" : "RES1"
}
{ "planId" : "PLN1",
"processId" : "PCS2",
"strategyId" : "RES2"
}
给出的查询planId
是'PCS1'
{ "planId" : "PLN1",
"processes" : [{
"processId":"PCS1",
"processData":{<data from Business Process Dictionary for PCS1>},
"strategies":[{<data from Recovery Strategy Dictionary for RES1>}]
},
{
"processId":"PCS2",
"processData":{<data from Business Process Dictionary for PCS1>},
"strategies":[{<data from Recovery Strategy Dictionary for RES1>},
{<data from Recovery Strategy Dictionary for RES2>}]
}]
}
从planRecoveryStrategy
?
解决方案
尝试对数据进行分组:
db.collection.aggregate([
{
$group: {
_id: {
planId: "$planId",
processId: "$processId"
},
strategies: { $addToSet: "$strategyId" }
}
},
{
$group: {
_id: "$_id.planId",
planId: { $first: "$_id.planId" },
processes: {
$addToSet: {
processId: "$_id.processId",
strategies: "$strategies"
}
}
}
}
]);
排序:
db.collection.aggregate([
{ $sort: { "strategyId": -1 } },
{ $sort: { "processId": 1 } },
{
$group: {
_id: {
planId: "$planId",
processId: "$processId"
},
strategies: { $addToSet: "$strategyId" }
}
},
{
$group: {
_id: "$_id.planId",
planId: { $first: "$_id.planId" },
processes: {
$addToSet: {
processId: "$_id.processId",
strategies: "$strategies"
}
}
}
}
]);
包括其他收藏:
db.collection.aggregate([
{ $sort: { "strategyId": -1 } },
{ $sort: { "processId": 1 } },
{
$lookup:
{
from: "BusinessProcess",
localField: "processId",
foreignField: "id",
as: "BusinessProcesses"
}
},
{
$lookup:
{
from: "RecoveryStrategy",
localField: "strategyId",
foreignField: "id",
as: "RecoveryStrategy"
}
},
{
$group: {
_id: {
planId: "$planId",
processId: "$processId",
processData: { $arrayElemAt : ["$BusinessProcesses" , 0] },
},
strategies: { $addToSet: "$RecoveryStrategy" }
}
},
{
$group: {
_id: "$_id.planId",
planId: { $first: "$_id.planId" },
processes: {
$addToSet: {
processId: "$_id.processId",
processData: "$_id.processData",
strategies: "$strategies"
}
}
}
}
]);
推荐阅读
- node.js - 创建子文档时,它只显示 id - 不显示创建的子文档数据
- flutter - 在 PdfViewerScaffold 上颤振 PopupMenu 条目
- react-native - 获取新更新失败
- javascript - 替换 URL,无论是 http 还是 https
- google-sheets - 如何在一个查询中从不同工作表返回多个范围
- javascript - Ajax 或 Django Rest 框架对 Post Data 的行为很奇怪
- r - 为什么我在 lmerTest 中使用 ls_means 语句得到空结果?
- flutter - 为什么 ConstrainedBox 从 FittedBox 中泄漏出来
- python - 带有硒的 Instagram 刮刀
- azure-active-directory - EasyAuth 与不同主机上的 SPA 和 AzureFunction