2013-07-24 2 views
2

Я пытаюсь удалить некоторые части данных из документов с заданной достаточно простой структурой, которая станет намного глубже и тяжелее, чем это, как проект идет:Rethinkdb удаления данных из документов

{ 
    id: "...", 
    name: "...", 
    phone: "...", 
    data: { 
     key1: "val1", 
     ... 
    } 
    ... 
} 

Я что нет возможности обновлять/удалять разделы из вложенных частей, кроме замены всего дерева обновленным деревом.

Например, если я хочу, чтобы удалить key1 из данных документа, мне нужно обновить раздел документов данных с копией его там, где key1 не содержатся

document.update({data: new dict without key1}) 

Есть ли eaiser способ удаления часть из корня поля, подобного документу, - без обновления всего документа с копией самого себя, которая не содержит ключ и значение имени? Должен ли я глубоко копировать и фильтровать документ каждый раз, когда мне нужно удалить некоторые части данных?

ответ

5

Ниже приведен запрос, который удаляет ключ из корня документа:

r.table('foo').get(document_id).replace(r.row.without('key')) 

Вы также можете сделать это для нескольких документов следующим образом:

r.table('foo').filter(condition).replace(r.row.without('key')) 

Как предстоящего 1.8 выпуска , вы также сможете сделать это для вложенных ключей следующим образом:

r.table('foo').get(document_id).replace(r.row.without({data: { key1: true}})) 

В настоящее время com выше по существу заменяет документ самой копией без соответствующих ключей на сервере. В следующих нескольких версиях это будет сильно оптимизировано для минимизации копирования документов в памяти (так что, хотя похоже, что вы заменяете документ своей копией без ключа, под капотом операция будет выполняться деструктивно без какого-либо копирования) , Будущие выпуски могут обновлять базовую структуру, поэтому полный документ не должен быть записан на диск.

Если вы используете команду without, вам не нужно ничего делать, чтобы воспользоваться этими оптимизациями (кроме обновления сервера).

Надеюсь, это поможет.

+0

Спасибо Слава. Я с нетерпением жду следующих выпусков, rethinkdb пока прекрасен. – hinoglu

+0

hm r.table ("cv"). Get ("e1a8b71f-ba52-4fd4-8c3a-e981df1e3108"). Update (r.row.without ("name")) возвращает "неизменный: 1", документ все еще имеет имя поля. Я использую 1.7.3 выпуск ubuntu – hinoglu

+0

Извините, вместо 'update' используйте' replace'. Я должен знать лучше, чем отправлять ответы в 4 часа ночи :) Я обновлю сообщение. – coffeemug