2016-08-08 41 views
0

Ich bin ein Neuling auf Cassandra und mein aktuelles Projekt für mich rief eine Tabelle mit den folgenden Spalten zu erstellen:Wie aktualisiert man die Liste <string> Spalte mit Mapper.UpdateAsync in Cassandra?

id uuid PRIMARY KEY, 
connections list<text>, 
username text 

I Cassandras IMapper Schnittstelle bin mit meiner CRUD-Operationen zu behandeln. Während ich Dokumentation, die beschreiben, wie Sie die Mapping-Komponente hier für grundlegende Operationen verwenden:

http://docs.datastax.com/en/developer/csharp-driver/2.5/csharp-driver/reference/mapperComponent.html

ich keine Dokumentation finden konnte, die beschreiben, wie Elemente aus der Liste Spalte für einen bestimmten Datensatz mit dem Mapper hinzufügen und entfernen Komponente. Ich habe versucht, den Datensatz aus der Datenbank abzurufen, die Entität zu aktualisieren und die Änderungen im Datensatz zu speichern, aber der Datensatz wird nicht in der Datenbank aktualisiert. Es bleibt nach dem Update gleich. Die Einfügeoperation funktioniert jedoch und spiegelt die Entität auf das Objekt in der Liste zurück.

User user = await _mapper.SingleAsync<T>("where Name = " + name); 
user.Addresses = user.Addresses.Concat(new string[] { address }); 
await _mapper.UpdateAsync<T>(user); 

Wie sollte dieses Szenario in Cassandra behandelt werden?

+0

Wie sind Sie mit den Antworten weitergekommen, @ user1790300? – halfer

Antwort

0

Sie können die plus (+) and minus (-) CQL operators verwenden, um Elemente aus einer Liste anzufügen/voranzustellen oder zu entfernen.

In Ihrem Fall wäre es:

// When using parameters, use query markers (?) instead of 
// hardcoded stringified values 
User user = await _mapper.SingleAsync<User>("where id = ?", id); 
await _mapper.UpdateAsync<T>(
    "SET connections = connections + ? WHERE id = ?", newConnections, id"); 

Beachten Sie, dass durch die Natur sind nicht idempotent hängen und prepend Operationen. Insbesondere wenn einer dieser Operations-Zeitüberschreitungen auftritt, ist ein erneuter Versuch der Operation nicht sicher und kann (oder kann nicht) dazu führen, dass der Wert zweimal angehängt/vorgehängt wird.

0

denke ich, um für diese zu arbeiten und effizient Sie mehrere Dinge benötigen:

  • teilweise Aktualisierung

Es ist atomarer und nicht Sie den Datensatz benötigen zuerst zu holen. Wenn Sie nur die Felder angeben, die Sie aktualisieren möchten, vermeiden Sie unnötige Belastungen des Drahtes und entlasten den Verdichter.

  • Verwendung CqlOperator.Append/CqlOperator.Prepend/CqlOperator.SubstractAssign

die Ihnen erlauben, nur die Sammlung Elemente, die Sie hinzufügen möchten angeben/entfernen.

Beide Optimierungen sind über die API Table verfügbar, nicht sicher über die .