2016-06-01 21 views
1

ich folgende Projektion haben:Filteranordnung und das Rück spezifische Eigenschaft

db.tickets.aggregate([ 
{ 
    $match: { 
    "satisfaction_rating.id": {"$exists": true} 
    } 
}, 
{ 
    $project: { 
    "ticketId": "$id", 
    "employee": "$assignee.name", 
    "subject": "$subject", 
    "memberId": { 
     "$filter": { 
     "input": "$custom_fields", 
     "as": "field", 
     "cond": {"$eq": ["$$field.id", 24685851]} 
     } 
    }, 
    "requester": "$requester.name", 
    "created": "$created_at", 
    "solved": "$metric_set.solved_at", 
    "resolutionTimeInHours": {"$trunc": {"$divide": ["$metric_set.full_resolution_time_in_minutes.business", 60]}}, 
    "score": "$satisfaction_rating.score", 
    "comment": "$satisfaction_rating.comment" 
    } 
}, 
{ 
    $out: "satisfaction" 
}]); 

$ Filter gibt ein Array. Was ich tun möchte, ist, das erste Element aufzunehmen und eine Eigenschaft zu erhalten, die dann an memberId statt an ein Array mit einem Element gebunden werden soll.

Ich habe mich eine Weile umgeschaut, aber keine passende Lösung gefunden. Kann mir jemand einen Tipp geben?

Antwort

1

@ user3100115 führte mich in die richtige Richtung.

Hier ist meine endgültige Lösung:

"memberId": { 
    "$let": { 
     "vars": { 
      "memberId": { 
       "$arrayElemAt": [ 
       {"$filter": { 
         "input": "$custom_fields", 
         "as": "field", 
         "cond": {"$eq": ["$$field.id", 24685851]} 
       }} 
       ,0] 
       } 
     }, 
     "in": "$$memberId.value" 
    } 
} 
1

können Sie den $arrayElemAt Operator das Element aus $filter ‚s Ergebnis und verwenden Sie den $let Operator mit den dot notation zurückzukehren, um das Unterdokumentenfeld zuzugreifen.

"memberId": { 
    "$let": { 
     "vars": { 
      "field": { 
       "$arrayElemAt": [ 
        "$filter": { 
         "input": "$custom_fields", 
         "as": "field", 
         "cond": { "$eq": [ "$$field.id", 24685851 ]} 
        }, 
        0 
       ] 
      } 
     }, 
     "in": "$$field.id" 
    } 
} 
+0

einen Schritt weiter. Aber wie kann ich eine Eigenschaft dieses ersten Elements anstelle des Elements selbst erhalten? –

+0

Möchten Sie nur das Feld 'ID'? – styvane

Verwandte Themen