Запрос MongoDB для вложенной группировки - PullRequest
0 голосов
/ 03 октября 2018

У меня есть 3 коллекции:

  1. План
  2. Бизнес-процесс
  3. Стратегия восстановления

Три из них хранят свои ПервичныеВведите _id и

У меня есть другая коллекция: planRecoveryStrategy, в которой хранится

  1. planId
  2. businessProcessId
  3. 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?

1 Ответ

0 голосов
/ 03 октября 2018

Попробуйте для группировки данных:

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"
                }
            }
        }
    }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...