2016-05-07 7 views
1

Ich möchte einen Benutzer der Datenbank hinzufügen, aber ich würde es lieber in eine Operation statt r.table('users').get(id) dann Einfügen tun, wenn das Ergebnis null ist.RethinkDB: Versuchen Sie, Datensatz in einem Vorgang hinzuzufügen

ich, so etwas zu tun hatte gehofft:

r.table('users').insert({ 
    id: email 
}) 
.run(conn) 
.then(result => { 
    if (result.errors) { 
     // result.first_error contains a string message like 
     // "Duplicate primary key `id`:\n{\n\t".........." 
    } 
}); 

Überprüfung jedoch, wenn result.first_error enthält das Wort „Duplizieren“ scheint eine hacky Lösung.

Ist dies nur in 2 Operationen möglich (versuchen Sie den Datensatz mit get zu finden, dann insert, falls er nicht existiert)? Scheint ineffizient.

Antwort

1

Sie eine Funktion angeben zu insert und erzeugen Sie eine benutzerdefinierte Fehlermeldung, dann führen Sie einen Gleichheitsvergleich dazu. So etwas wie table.insert(doc, {conflict: function(id, old, new) { return r.error("conflict"); }}).

Persönlich würde ich jedoch nur überprüfen, ob "Duplicate Primärschlüssel" ein Präfix der Fehlermeldung ist, die Sie zurück erhalten, und wenn es als ein doppelter Primärschlüsselfehler behandelt wird.

+0

Ja, ich war besorgt, dass sich die Nachricht ändern könnte, aber es ist unwahrscheinlich. Ihre erste Idee funktioniert zwar, also werde ich diesen Dank verwenden, es ist ziemlich sauber mit einer Pfeilfunktion. –

1

Wenn Sie die insert doc https://rethinkdb.com/api/javascript/insert/ lesen, hat es diesen Abschnitt:

Konflikt: Bestimmen Handhabung von Dokumenten mit dem gleichen Primärschlüssel wie vorhandene Einträge eingefügt wird. Es gibt drei eingebaute Methoden: "Fehler", "ersetzen" oder "aktualisieren"; alternativ können Sie eine Konfliktlösungsfunktion bereitstellen. "Fehler": Fügen Sie das neue Dokument nicht ein und erfassen Sie den Konflikt als Fehler. Dies ist der Standardwert. "Ersetzen": Ersetzen Sie das alte Dokument in seiner Gesamtheit durch das neue. "update": Felder des alten Dokuments mit Feldern aus dem neuen aktualisieren. Funktion (id, oldDoc, newDoc) {return resolvedDoc}: eine Funktion, die die ID, alte und neue Dokumente als Argumente erhält und ein Dokument zurückgibt, das anstelle des Konflikts eingefügt wird.

So können Sie dies tun:

r.table('users').insert({ 
    id: email 
}, {conflict: 'update'}) 

Oder andere Lösung ist replace, zu verwenden, aber die id in get vorbei, wie folgt aus:

r.table('users') 
.get(email) 
    .replace({ 
    id: email 
    }) 
+0

Danke aber in diesem Fall möchte ich es zu Fehler, wenn die ID bereits existiert, da ich nicht möchte, dass ein Benutzerkonto überschrieben wird. Mein Problem ist, dass es keinen guten Weg gibt zu wissen, ob der Fehler durch einen doppelten Datensatz oder etwas anderes verursacht wurde. –