2016-06-14 12 views
1

Ich habe die "Wettbewerb" -Tabelle rethinkdb. Auf der zweiten Ebene habe ich Läufer und jeder Läufer haben eine Liste der Ergebnisse:RethinkDB, Abfrage mit Karte und Filter

"total_results": { 
    "433915": [ #runner_id 
    { 
     "judge": "15561671", 
     "result": 5, 
     "round": "1" 
    }, 
    { 
     "judge": "08136a59", 
     "result": 4, 
     "round": "1" 
    } 
    ] 
} 

ich rethinkdb query:

results = (r.table('competitions').filter(lambda c: c['unique_id'] == competition_id) 
    .map(lambda c: c['total_results']) 
    .map(lambda t: t[runner_id]) 
.run(conn)) 

Dieses Stück Code funktioniert einwandfrei. Jetzt möchte ich Filter basierend auf 'runden' Wert anwenden. Ich füge es direkt nach dem zweiten .map(), so ergibt Abfrage wie folgt aussieht:

results = (r.table('competitions').filter(lambda c: c['unique_id'] == competition_id) 
    .map(lambda c: c['total_results']) 
    .map(lambda t: t[runner_id]) 
    .filter(lambda x: x['round'] == round) 
.run(conn)) 

Aber ich bin immer leere Liste. Und das ist seltsam für mich, denn wenn ich mich bewege .filter() außerhalb der rethinkdb Abfrage und tun es mag:

by_round = filter(lambda x: x['round'] == round, results) 

I Ergebnisse. Es sollte etwas passieren, was ich falsch mache, wenn ich die Frage neu überlege ... Kannst du mir bitte einen Tipp geben?

p.s. Ich habe Tausende Ergebnisse in der Datenbank. Es sollte Dutzende Ergebnisse basierend auf meinen Abfrageparams geben.

Antwort

1

Ich denke, Sie wollen Ihre zweite map eine concat_map sein. (Alternativ, wenn Sie das vorhandene Ausgabeformat mögen, können Sie die filter innerhalb einer map wie .map(lambda x: x.filter(...)) setzen.)

+0

Hallo @mlucy, vielen Dank für die Antwort! Ja, du hattest recht, meine zweite Map wurde durch concat_map ersetzt. Könnten Sie bitte concatMap in Ihrer Antwort (Python-Weg) zu concat_map ersetzen? Ich werde Sie als "akzeptiert" kennzeichnen. – Desprit