Wie kann ich Mongodb Aggregation in diesem Beispiel?

Ich bin derzeit mit Python zu bauen, viele meiner Ergebnisse anstelle von MongoDB selbst. Ich versuche in meinen Kopf zu kriegen-Aggregation, aber ich bin kämpfen, ein bisschen. Hier ist ein Beispiel, was ich Tue derzeit, was vielleicht besser sein könnte, behandelt, von MongoDB.

Habe ich eine Sammlung von Programmen und einer Sammlung von Episoden. Jedes Programm hat eine Liste der Episoden (DBRefs) zugeordnet. (Die Episoden gespeichert sind, in Ihre eigene Sammlung, weil beide Programme und die Episoden sind sehr Komplex und tief, so dass die Einbettung unpraktisch ist). Jede Folge hat eine Dauer (float). Wenn ich will, ein Programm zu finden das Durchschnittliche episode Dauer, so mache ich das:

episodes = list(db.Episodes.find({'Program':DBRef('Programs',ObjectId(...))}))
durations = set(e['Duration'] for e in episodes if e['Duration'] > 0)
avg_mins = int(sum(durations) / len(durations) / 60

Dies ist ziemlich langsam, wenn ein Programm hat über 1000 Episoden. Gibt es eine Möglichkeit, ich kann es in MongoDB?

Ist hier einige Beispiel-Daten, die in der Mongo-shell-format. Es gibt drei Episoden, die zu den gleichen Programm. Wie kann ich den Durchschnitt berechnen episode Dauer für das Programm?

> db.Episodes.find({
    '_Program':DBRef('Programs',ObjectId('4ec634fbf4c4005664000313'))},
   {'_Program':1,'Duration':1}).limit(3)

{
    "_id" : ObjectId("506c15cbf4c4005f9c40f830"),
    "Duration" : 1643.856,
    "_Program" : DBRef("Programs", ObjectId("4ec634fbf4c4005664000313"))
}
{
    "_id" : ObjectId("506c15d3f4c4005f9c40f8cf"),
    "Duration" : 1598.088,
    "_Program" : DBRef("Programs", ObjectId("4ec634fbf4c4005664000313"))
}
{
    "_id" : ObjectId("506c15caf4c4005f9c40f80e"),
    "_Program" : DBRef("Programs", ObjectId("4ec634fbf4c4005664000313")),
    "Duration" : 1667.04
}
  • Wie haben Sie versucht, es zu tun, w/aggregation-framework? Sieht aus wie Sie möchten-Gruppe Episoden von programId und finden Sie die Durchschnittliche duration-matching nur Dauer > 0 ist der erste?
  • Ich denke, du hast Recht, aber ich weiß nicht wirklich verstehen, die syntax. Sorge um die spell it out für mich?
  • Können Sie eine Beispiel-DB in shell-format und die gewünschte Ausgabe? Jemand kann in der Lage sein, um Ihnen zu helfen zusammen ein AF Abfrage.
  • Toller Vorschlag. Ich habe es getan.
InformationsquelleAutor MFB | 2012-10-29
Schreibe einen Kommentar