Robert Zaremba
Robert Zaremba

Reputation: 8481

How to remove a key from a RethinkDB document?

I'm trying to remove a key from a RethinkDB document. My approaches (which didn't work):

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

Other approach:

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

This one just sets row.key = null (which looks reasonable).

Examples tested on rethinkdb data explorer through web UI.

Upvotes: 47

Views: 16907

Answers (3)

Doug Coburn
Doug Coburn

Reputation: 2575

You do not need to use replace to update the entire document. Here is the relevant documentation: ReQL command: literal

Assume your user document looks like this:

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

And you want to remove age from the data property. Normally, update will just merge your new data with the old data. r.literal can be used to treat the data object as a single unit.

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"
  }
}

or

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"
  }
}

Upvotes: 6

Michael Glukhovsky
Michael Glukhovsky

Reputation: 1018

Here's the relevant example from the documentation on RethinkDB's website: http://rethinkdb.com/docs/cookbook/python/#removing-a-field-from-a-document

To remove a field from all documents in a table, you need to use replace to update the document to not include the desired field (using without):

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

To remove the field from one specific document in the table:

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

You can change the selection of documents to update by using any of the selectors in the API (http://rethinkdb.com/api/), e.g. db, table, get, get_all, between, filter.

Upvotes: 86

Etienne Laurin
Etienne Laurin

Reputation: 7184

You can use replace with without:

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

Upvotes: 12

Related Questions