пн go группа фасетов 3 выдала результаты - PullRequest
0 голосов
/ 06 августа 2020

Я создал следующий запрос mon go ниже, где мне нужно сопоставить 3 разных результата, поэтому я использовал фасет, с которым я борюсь, это снова сгруппировать его после объединения в конце (также в стороне вопрос, есть ли лучший способ выполнить запрос ниже, отмечая, что я могу использовать только функции в Mon go 3.4):

Текущий результат выглядит следующим образом:

[1]
dataGrouped:
  _id:
    cap: CAP1
    location: Somewhere
  totalReviewedRequests :  1.0

[2]
dataGrouped:
  _id:
    cap: CAP2
    location: Somewhere
  totalReviewedRequests :  1.0

[3]
dataGrouped:
  _id:
    cap: CAP2
    location: Somewhere else
  totalReviewedRequests :  5.0

[4]
dataGrouped:
  _id:
    cap: CAP1
    location: Somewhere
  totalApprovedRequests :  1.0
    
[5]
dataGrouped:
  _id:
    cap: CAP1
    location: Somewhere
  totalRejectedRequests :  5.0

What I want для достижения:

cap: CAP1
location.        totalReviewed.    totalRejected.    totalApproved
Somewhere.       1                 5                 1

cap: CAP2
location.        totalReviewed.    totalRejected.    totalApproved
Somewhere.       1                 0                 0
Somewhere else.  5                 0                 0 
db.events.aggregate([
  { "$facet": {
    "TotalReviewed": [
      { $unwind: "$payload"},
      { "$match" : { eventType : "WORKFLOW_PROGRESSED" ,  "outcome" : {
                          $in: ["x", "y"]
                    }}},
        { "$group": {
        "_id": {
            "cap": "$payload.draft.id",
            "location": "$payload.location"
        },
        "totalReviewedRequests": { "$sum": 1 }
    }}],
    "ApprovedRequests": [
      { $unwind: "$payload" },
      { "$match" : { eventType : "WORKFLOW_ENDED_APPROVED", "payload.request": { "$exists": true }  }},
      { "$group": {
        "_id": {
            "cap": "$payload.approved.id",
            "location": "$payload.location"
        },
        "totalApprovedRequests": { "$sum": 1 }
    }}],
    "RejectedRequests": [
      { $unwind: "$payload.draft" },
      { "$match" : { "outcome" : "y"  }},
      { "$group": {
         "_id": {
            "cap": "$payload.draft.id",
            "location": "$payload.location"
         },
        "totalRejectedRequests": { "$sum": 1 }
    }   }
    ]
  }},
  { "$project": {
    "dataGrouped": { "$concatArrays": ["$TotalReviewed", "$ApprovedRequests", "$RejectedRequests"] }
  }},
  { "$unwind": "$dataGrouped" }
  
])

1 Ответ

0 голосов
/ 06 августа 2020

Удалось выработать решение, пришлось использовать ПУ sh:

{ $group: {
    _id: { capability: "$dataGrouped._id.cap" },
        content: {
             $push: {
                 location: "$dataGrouped._id.location" 
             }
        }
        
         }
  }
...