2009-11-27 9 views
0

Est-il possible de regrouper les résultats par une clé trouvée dans un tableau d'objets dans une liste? Par exemple, disons que j'ai un tableau des réponses à l'enquête (survey_responses), et chaque entrée représente une seule réponse. Un ou plusieurs des questions de l'enquête est un choix multiple, de sorte que les réponses stockées pourrait ressembler à:Regroupement par clé d'objet imbriquée dans MongoDB

survey_responses.insert({ 
    'name': "Joe Surveylover", 
    'ip': "127.0.0.1", 
    'favorite_songs_of_2009': [ 
     {'rank': 1, 'points': 5, 'title': "Atlas Sound: Quick Canals"}, 
     {'rank': 2, 'points': 4, 'title': "Here We Go Magic: Fangela"}, 
     {'rank': 3, 'points': 3, 'title': "Girls: Hellhole Ratrace"}, 
     {'rank': 4, 'points': 2, 'title': "Fever Ray: If I Had A Heart"}, 
     {'rank': 5, 'points': 1, 'title': "Bear in Heaven: Lovesick Teenagers"}], 
    'favorite_albums_of_2009': [ 
     # and so on 
    ]}) 

comment puis-je groupe par le title de favorite_songs_in_2009 pour obtenir le nombre total de points pour chaque chanson dans le tableau ?

Répondre

0

Il semble que votre seule option est de le faire dans votre propre code Python:

song_points = {} 
for response in survey_responses.find(): 
    for song in response['favorite_songs_of_2009']: 
     title = song['title'] 
     song_points[title] = song_points.get(title, 0) + song['points'] 

Vous obtiendrez vos résultats dans la variable song_points.

+0

c'est plus ou moins ce que je suis arrivé. son peut-être pas la plus efficace, mais un compte peut être récolté en utilisant un champ imbriqué dans une fonction '' l'aide reduce' doc.field_name.forEach': la fonction 'reduce' ressemblerait à quelque chose comme ceci: fonction (doc, out) { doc.field.forEach (function (item_in_list) { // faire quelque chose d'intéressant avec 'item_in_list' } } – Carson

Questions connexes