2017-10-18 32 views
0

J'ai une collection:Comment résumer la valeur des clés dans subcollection dans une plage en utilisant pymongo

{ date: datetime(2017, 10, 18, 0, 0, 0), 
    count: { 
    S: 7, 
    A: 8 
    } 
} 
{ date: datetime(2017, 10, 19, 0, 0, 0), 
    count: { 
    A: 9 
    } 
} 
{ date: datetime(2017, 10, 20, 0, 0, 0), 
    count: { 
    A: 9, 
    B: 8 
    } 
} 

Comment puis-je utiliser le cadre d'agrégation mongo pour résumer ce nombre dans la collection dans une plage (par exemple 2 jours), et obtenir la sortie ressemble à:

{ 
    count: { 
     S: { in_2_days: 7, in_3_days: 7 }, 
     A: { in_2_days: 16, in_3_days: 26 }, 
     B: { in_2_days: 0, in_3_days: 8 } 
    } 
} 

PS J'avais pensé à la sortie comme ceci:

{ 
    in_days: 2 
    count: { 
     S: 7, 
     A: 16 
    } 
} 
{ 
    in_days: 3 
    count: { 
     S: 7, 
     A: 26, 
     B: 8 
    } 
} 

Mais ce n'est pas ce que je veux.

Désolé pour mon mauvais anglais.

+0

Avez-vous seulement des variables 'S', 'A', 'B' dans la collection? ou peut être beaucoup? –

+0

@AyodhyankitPaul il peut être beaucoup –

Répondre

0

Ce n'est pas la meilleure solution, mais je donne un essai, laissez-moi savoir si cela vous aide:

Je suppose que votre collection est dans un fichier txt nommé abc.txt: Comme je l'ai déjà fait remarquer que essayez cette solution si votre collection ont seulement « S », « A », les variables « B »:

import re 
pattern="([S]:\s(\d{0,26}))|([A]:\s(\d{0,26}))|([B]:\s(\d{0,26}))|(count)" 
pattern_dict={} 
final_pattern=[] 
count=[] 

with open("abc.txt") as f: 
    for line in f: 
     finding=re.finditer(pattern,line) 
     for match in finding: 

      if 'S' not in pattern_dict: 

       if match.group(2)!= None: 
        pattern_dict["S"]=[int(match.group(2))] 
      else: 
       if match.group(2) != None: 
        pattern_dict["S"].append(int(match.group(2))) 
      if pattern_dict not in final_pattern: 

       final_pattern.append(pattern_dict) 

      if 'A' not in pattern_dict: 
       if match.group(4) != None: 
        pattern_dict["A"]=[int(match.group(4))] 
      else: 
       if match.group(4) != None: 
        pattern_dict["A"].append(int(match.group(4))) 
      if pattern_dict not in final_pattern: 

       final_pattern.append(pattern_dict) 

      if 'B' not in pattern_dict: 
       if match.group(6) != None: 
        pattern_dict['B']=[int(match.group(6))] 
      else: 
       if match.group(6) != None: 
        pattern_dict['B'].append(int(match.group(6))) 
      if pattern_dict not in final_pattern: 

       final_pattern.append(pattern_dict) 

      if match.group(7)!=None: 
       count.append(match.group(7)) 



dict1=final_pattern[0] 

sum_of_items=[(k,v) for k,v in dict1.items()] 


count2=0 


for item in sum_of_items: 
    if len(item[1])==1: 


      print("for {} total days {} = {} ".format(item[0],len(count),"".join(str(i) for i in item[1]))) 



    else: 
     count1 = 0 
     for i in range(len(item[1])): 
      count1 += 1 

      print("for {} total days {} = {}".format(item[0],count1,sum(item[1][:i + 1]))) 
+0

Hmm, merci! Mais en fait, je veux utiliser le cadre d'agrégation mongo (je l'ai mentionné dans le post) pour obtenir une sortie comme ça –

0

J'utilise enfin le cadre d'agrégation pour résumer et d'écrire un code python à « forme » les données dans le formulaire Je veux.