2016-12-12 5 views
2

Ich habe ein Python-Skript, in dem ich Pymongo verwende, um Sammlungen zusammenzufassen und bestimmte Operationen an ihnen auszuführen, wenn die Summe eines bestimmten Aggregats größer als eine Zahl ist (in diesem Fall 30).PyMongo TypeError

agg = collection.aggregate([{"$match":{"valid":1}}, {"$group": {"_id": {"createdby" : "$createdby" ,"addedtime" : "$addedtime", "empname" : "$empname"}, "count":{"$sum":1}}}]) 

    cnt = 0 
    for eachAgg in agg: 
    print "eachAgg = ",eachAgg 
    if eachAgg['count'] >= 30: 

Wenn ich dieses Skript ausführen, ich bin immer

eachAgg = ok 
    Traceback (most recent call last): 
    File "test.py", line 33, in <module> 
    if eachAgg['count'] >= 30: 
    TypeError: string indices must be integers 

Ich verstehe nicht, wie $sum Aggregat nicht eine ganze Zahl ist.

+1

'eachAgg' ist ein String und' 'count'' ist offensichtlich ein String, also 'eachAgg [' count ']' verursacht ' TypeError: String-Indizes müssen ganze Zahlen sein. – DeepSpace

+0

@DeepSpace Wenn ich die Abfrage 'db.tme_count.find ({" count ": {$ type: 2}})', bekomme ich kein Ergebnis außer 'db.tme_count.find ({" count ": {$ type: 16}}) 'gibt mir eine Liste von Dokumenten. Gründe dafür? – Anubhav

+0

Auch '> typeof db.tme_count.findOne(). Count' gibt mir ' Nummer' – Anubhav

Antwort

4

agg: gibt einen detaillierteren dict mit dem Ergebnis der Aggregation dh:

{ 
     u'ok': 1.0, 
     u'waitedMS': 0L, 
     u'result': [<your actual aggregation result>] 
    } 

Deshalb sollten Sie TypeError: string indices must be integers bekommen, weil du Schlüssel im dict (for eachAgg in agg) iterieren, wo ein Schlüssel-String und String-Indizes müssen ganze Zahlen sein.

der realen Daten führen es in agg['result'] ist, versuchen:

for eachAgg in agg['result']: 
    if eachAgg['count'] >= 30: 
    ....