Как удалить ключ из документа RethinkDB?

Я пытаюсь удалить ключ из документа RethinkDB. Мои подходы (которые не сработали):

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

Другой подход:

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

Этот просто устанавливает row.key = null (что выглядит разумно).

Примеры протестированы в rethinkdb data explorer через веб-интерфейс.


person Robert Zaremba    schedule 02.09.2013    source источник


Ответы (3)


Вот соответствующий пример из документации на веб-сайте RethinkDB: http://rethinkdb.com/docs/cookbook/python/#removing-a-field-from-a-document

Чтобы удалить поле из всех документов в таблице, вам нужно использовать replace, чтобы обновить документ, чтобы он не включал нужное поле (используя without):

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

Чтобы удалить поле из одного конкретного документа в таблице:

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

Вы можете изменить выбор документов для обновления, используя любой из селекторов в API (http://rethinkdb.com/api/), например db, table, get, get_all, between, filter.

person Michael Glukhovsky    schedule 02.09.2013
comment
Если вы ищете версию рецепта на JavaScript: rethinkdb.com/docs/cookbook/javascript/ - person neumino; 03.09.2013
comment
Как я могу сделать это для вложенного поля ключа? - person Suvitruf - Andrei Apanasik; 14.07.2015
comment
@Suvitruf, вы можете использовать синтаксис вложенного поля следующим образом: .replace(r.row.without({key1: {key2: true}})) - person BarthesSimpson; 09.11.2015
comment
Как удалить вложенное свойство? нравится without('foo.bar.baz'), чтобы удалить свойство baz? - person chovy; 30.03.2017

Вы можете использовать replace с without:

r.db('db').table('user').replace(r.row.without('key'))
person AtnNn    schedule 02.09.2013
comment
Как я могу сделать это для вложенного поля ключа? - person Suvitruf - Andrei Apanasik; 14.07.2015
comment
Для вложенных полей вы можете использовать синтаксис вложенного поля следующим образом: .replace(r.row.without({key1: {key2: true}})) - person BarthesSimpson; 09.11.2015
comment
Как совместить это с обновлением значения другого ключа? - person Whyhankee; 12.11.2016
comment
Что здесь делает true? - person chovy; 30.03.2017

Вам не нужно использовать replace для обновления всего документа. Вот соответствующая документация: Команда ReQL: literal

Предположим, что ваш пользовательский документ выглядит так:

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

И вы хотите удалить возраст из свойства данных. Обычно обновление просто объединяет ваши новые данные со старыми данными. r.literal можно использовать для обработки объекта данных как единой единицы.

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"
  }
}
person Doug Coburn    schedule 28.06.2017