2016-12-24 1 views
0

Ich habe eine MongoDB Sammlung genre_count alsMongoDB - Wie Feld zu extrahieren, mit max Wert

user | genre   | count 
-----+---------------+------- 
1 | Western  | 2 
1 | Adventure  | 1 
1 | Comedy  | 5 
2 | Western  | 3 
2 | Thriller  | 1 
2 | Romance  | 2 

ich das Genre für jeden Benutzer mit einem maximalen Anzahl für 1 Benutzer, dh extrahieren muß, ist das Genre mit maximaler Zählung Comedy mit Graf 5. ich habe versucht, mehr Möglichkeiten, mit wie:

db.genre_count.aggregate([ 
    { 
    $group:{ 
    _id:{ 

     user:"$user", 
     genre:"$genre" 
    }, 
    max_val:{ 
     $max: "$count" 
    } 
    } 
} 
]) 

ich dachte, dies funktionieren würde, aber es kehrte die Anzahl der Benutzer für jedes Genre es also im Grunde retur ned mir alle Aufzeichnungen.

Dann habe ich versucht, eine andere Lösung, die teilweise in bearbeitetem

db.genre_count.aggregate([ 
    { 
    $group:{ 
    _id:{ 

     user:"$user" 
    }, 
    max_val:{ 
     $max: "$count" 
    } 
    } 
} 
]) 

Aber das zurück nur den Maximalwert, da sie keine entsprechenden Genre-Informationen für diesen Maximalwert hat. Gibt es eine Möglichkeit, das gewünschte Ergebnis zu erzielen?

Antwort

1

die maximale Anzahl und Genreliste zurückzukehren, können Sie die $max in Ihrer Gruppenphase verwenden, müssen die maximale „Count“ zurückzukehren für jede Gruppe dann verwenden $push Akku-Operator, um eine Liste von "Genre Name" und "Count" für jede Gruppe zurückgeben.

Von dort müssen Sie den Operator $map in Ihrer $project Bühne verwenden, um eine Liste von genre_names neben der maximalen Anzahl zurückzugeben. Die $cond hier wird verwendet, um jede Genrezahl mit dem Maximalwert zu vergleichen.

db.genre_count.aggregate([ 
     { '$group': { 
      '_id': '$user', 
      'maxCount': { '$max': '$count' }, 
      'genres': { 
       '$push': { 
        'name': '$genre', 
        'count': '$count' 
       } 
      } 
     }}, 
     { '$project': { 
      'maxCount': 1, 
      'genres': { 
       '$setDifference': [ 
        { '$map': { 
         'input': '$genres', 
         'as': 'genre', 
         'in': { 
          '$cond': [ 
           { '$eq': [ '$$genre.count', '$maxCount' ] }, 
           '$$genre.name', 
           false 
          ] 
         } 
        }}, 
        [false] 
       ] 
      } 
     }} 
    ]) 
1

Ich glaube, Sie dieses Aggregat benutzen können:

db.genre_count.aggregate([ 
{ 
    $sort: {user:1, count:1} 
}, 
{ 
    $group: 
    { 
     _id: "$user", 
     maxCount: {$max: "$count"}, 
     genre: {$last: "$genre"} 
    } 
}]) 
+0

es funktioniert und ist gut für mich, aber ich habe eine Frage. Gibt es trotzdem könnte ich alle Werte mit der gleichen maximalen Anzahl zu extrahieren, d. H. Wenn mehrere Genres die gleiche maximale Anzahl haben, gibt es nur eine – scrpaingnoob

+0

@scrpaingnoob Ich habe versucht, die zweite Frage von Ihnen zu beantworten. In der aktuellen Antwort wird angenommen, dass Sie nach der Sortierung das letzte Genre auswählen (das den Maximalwert enthält), und Sie erhalten alle entsprechenden Werte. Ich habe versucht, den Ansatz zu erklären. – Rahul

Verwandte Themen