2013-09-02 9 views
35

Ich versuche, einen Schlüssel aus einem RethinkDB-Dokument zu entfernen. Meine Ansätze (was nicht funktioniert):Wie entferne ich einen Schlüssel aus einem RethinkDB-Dokument?

r.db('db').table('user').replace(function(row){delete row["key"]; return row}) 

Andere Ansatz:

r.db('db').table('user').update({key: null}) 

Dieses nur setzt row.key = null (was vernünftig aussieht).

Beispiele getestet auf rethinkdb Daten Explorer über Web-UI.

Antwort

61

Hier sind das relevante Beispiel aus der Dokumentation auf RethinkDB Webseite: http://rethinkdb.com/docs/cookbook/python/#removing-a-field-from-a-document

Um ein Feld aus allen Dokumenten in einer Tabelle zu entfernen, müssen Sie replace verwenden um das Dokument so zu aktualisieren, dass es nicht das gewünschte Feld enthält (without):

r.db('db').table('user').replace(r.row.without('key')) 

Um das Feld von einem bestimmten Dokument in der Tabelle zu entfernen:

r.db('db').table('user').get('id').replace(r.row.without('key')) 

Sie haben die Auswahl von Dokumenten ändern können, indem unter Verwendung eines beliebigen der Wähler in der API (http://rethinkdb.com/api/) zu aktualisieren, z.B. db, table, get, get_all, between, filter.

+3

Wenn Sie nach der Javascript-Version des Rezepts suchen: http://rethinkdb.com/docs/cookbook/javascript/#removing-a-field-from-a-document – neumino

+3

Wie kann ich dies für verschachtelte Feld von tun Schlüssel? – Suvitruf

+7

@Suvitruf, können Sie die verschachtelte Feldsyntax wie folgt verwenden: '.replace (r.row.without ({key1: {key2: true}}))' – BarthesSimpson

9

Sie können replace mit without verwenden:

r.db('db').table('user').replace(r.row.without('key')) 
+2

Wie kann ich tue dies für verschachtelten Bereich der Schlüssel? – Suvitruf

+2

Für verschachtelte Felder können Sie die verschachtelte Feldsyntax wie folgt verwenden: '.replace (r.row.without ({key1: {key2: true}}))' – BarthesSimpson

+0

ehrfürchtiger Kommentar, danke! – pregmatch

1

Sie müssen nicht ersetzen, um das gesamte Dokument zu aktualisieren. Hier ist die entsprechende Dokumentation: ReQL command: literal

Angenommen, Ihr Benutzer Dokument wie folgt aussieht:

{ 
    "id": 1, 
    "name": "Alice", 
    "data": { 
    "age": 19, 
    "city": "Dallas", 
    "job": "Engineer" 
    } 
} 

Und Sie wollen Alter von der Dateneigenschaft entfernen. Normalerweise wird update nur Ihre neuen Daten mit den alten Daten zusammenführen. Mit r.literal kann das Datenobjekt als eine Einheit behandelt werden.

r.table('users').get(1).update({ data: r.literal({ age: 19, job: 'Engineer' }) }).run(conn, callback) 

// Result passed to callback 
{ 
    "id": 1, 
    "name": "Alice", 
    "data": { 
    "age": 19, 
    "job": "Engineer" 
    } 
} 

oder

r.table('users').get(1).update({ data: { city: r.literal() } }).run(conn, callback) 

// Result passed to callback 
{ 
    "id": 1, 
    "name": "Alice", 
    "data": { 
    "age": 19, 
    "job": "Engineer" 
    } 
}