2016-06-12 4 views
1

Контекст: на клиенте поле изменяется и это изменение распространяется на сервер как пара ключей-значений. Я начинаю с keypath, что-то вроде foo.bar.baz = cat, который я могу преобразовать в {foo: {bar: {baz: "cat"}}}, а затем merge в мой документ (который может выглядеть примерно как {foo: {bar: {baz: "dog"}}}).Обновление/слияние документа с помощью вложенного массива

До сих пор это работало отлично для всех объектов, однако она ломается, когда мне нужно что-то делать с массива.


Предположим, что мой документ в RethinkDB выглядел следующим образом: {name: "Me", pets: [{name: "Shadow"}]}. Пользователь решает обновить имя питомца, поэтому путь к ключу выглядит примерно так: pets[0].name = Sparky. Насколько я могу судить, это не может быть тривиально (или нетривиально, если на то пошло) превращаться во что-то, что я могу передать merge. Или это может быть? Мысли?

ответ

0

Вам нужно написать что-то вроде .update(function(row) { return {pets: row('pets').changeAt(0, row('pets')(0).merge({name: 'Sparky'}))};}). Я рекомендовал бы вместо этого сделать pets карту от имен к домашним животным (или от «чисел, преобразованных в строки» к домашним животным, если вы действительно хотите индексировать).

+0

Thanks mlucy. Я собираюсь дать карту чисел, как строки, чтобы попробовать. (Я бы * хотел *, чтобы сохранить «домашних животных», и если бы я был назначен по имени [сопоставление имя-значение], мне нужно было бы отслеживать порядок через другой массив ... который я 'd необходимо обновить, если какое-либо из имен изменилось.) – Max

+0

Хорошо, то, что я закончил делать, было несколько гротескным, но это для проекта хобби так или иначе. Я просто извлек весь объект, внеся необходимые изменения, а затем вернул все это («замените весь документ»). Простые, относительно легкие и без хаков ... кроме как неатома и довольно неэффективны. – Max