2016-05-24 10 views
1

Wie kann ich eine RethinkDB-Abfrage für ein Dokument schreiben, die eine zusammengeführte Version des Dokuments zurückgibt, wenn es gefunden wird, und null anderenfalls?Wie schreibe ich eine RethinkDB-Merge-Abfrage, die null Ergebnisse behandelt

Die folgenden, naiv, query (in JavaScript geschrieben) verursacht eine Ausnahme von .merge bei .get kehrt null (dh der Benutzer nicht gefunden wird) geworfen werden:

r.table('users') 
    .get(username) 
    .merge((user) => { 
    return { 
     'projects': r.table('projects').getAll(username, {index: 'owner',}) 
     .coerceTo('array'), 
    } 
    }) 
    .run(conn) 

Antwort

2

Schreibe eine merge Abfrage, während der Sache befaßt, wo ein Dokument nicht gefunden wird, kann durch den Einsatz von do und branch erreicht werden, so dass merge nur auf nicht-null-Ergebnisse aufgerufen wird:

r.table('users') 
    .get(username) 
    .do((user) => { 
    // Only perform a merge if user isn't null 
    return r.branch(
     user.eq(null), 
     null, 
     user.merge({ 
     'projects': r.table('projects').getAll(username, {index: 'owner',}) 
      .coerceTo('array'), 
     }) 
    ) 
    }) 
    .run(conn) 
+1

Danke, dass Sie sich die Zeit genommen haben, die Antwort auf Ihre eigene Frage zu posten! Sehr hilfreich :-) – David

+1

@David Danke für das Feedback, froh, dass es jemandem geholfen hat :) – aknuds1

0

Sie können .default(null) nach der Zusammenführungsabfrage hinzufügen, um Nichtexistenzfehler zu behandeln (obwohl dies auch alle anderen Nichtexistenzfehler in der Zusammenführungsabfrage behandelt).

+1

Kannst du im Code exemplifizieren, was du meinst, damit ich testen kann? – aknuds1

+1

Ich habe das Hinzufügen von '.default (null)' nach dem 'merge'-Teil der Abfrage getestet. Es funktioniert tatsächlich, aber mir ist überhaupt nicht klar, wie:/Als solche bevorzuge ich die Explizitheit von 'do' /' branch'. – aknuds1