Le réel .aggregate()
méthode n'est pas elle-même "asynchrone". Mais l'itération du curseur l'est.
Donc à la place :
cursor = db.activities.aggregate(pipeline)
while (yield cursor.fetch_next):
doc = cursor.next_object()
print(doc)
Comme le disent les docs.