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.


Solution 1:

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.

Solution 2:

You can use replace with without:

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

Solution 3:

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