2017-12-21 8 views
5

Unten ist ein Beispieldokument:MongoDB Aggregation: Gruppe auf gemeinsames Feld von zwei Arrays

{ 
    'uid': 1, 
    'sent': [ 
     { 
      'mid': 100, 
      'date': 20171210, 
     }, 
     { 
      'mid': 101, 
      'date': 20171210, 
     } 
    ], 
    'open': [ 
     { 
      'mid': 100, 
      'date': 20171220, 
     }, 
     { 
      'mid': 101, 
      'date': 20171220, 
     } 
    ] 
} 

ich gruppieren mag auf 'uid' und verschachtelten 'Mitte' Feldern aus.
Meine gewünschte Ausgabe ist:

{ 
    'uid': 1, 
    'mid': 100, 
    'sent': [ 20171210 ], 
    'open': [ 20171220 ] 
} 
{ 
    'uid': 1, 
    'mid': 101, 
    'sent': [ 20171210 ], 
    'open': [ 20171220 ] 
} 

Gibt es eine effiziente Art der Aggregation, die mich oben Ergebnis geben kann?

Antwort

2

Sie können das Array $unwind verwenden und dann $filter verwenden, um nur die übereinstimmenden Einträge im zweiten Array beizubehalten. Dann $ das zweite Array und $ Gruppe abwickeln.

db.temp.aggregate(
    [ 
     { 
      $unwind: { 
       'path': '$sent', 
      } 
     }, 
     { 
      $project: { 
       'uid': 1, 
       'sent': 1, 
       'open': { $filter: { 
            input: '$open', 
            as: 'this', 
            cond: { $eq: [ '$sent.mid', '$$this.mid' ] } 
           } } 

      } 
     }, 
     { 
      $unwind: { 
       'path': '$open', 
      } 
     }, 
     { 
      $group: { 
       '_id': { 'uid': '$uid', 'mid': '$sent.mid' }, 
       'sent': { '$push': '$sent.date' }, 
       'open': { '$push': '$open.date' } 
      } 
     }, 
     { 
      $project: { 
       '_id': 0, 
       'uid': '$_id.uid', 
       'mid': '$_id.mid', 
       'sent': 1, 
       'open': 1 
      } 
     }, 
    ] 
); 
Verwandte Themen