Обновление/объединение документа через вложенный массив

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

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


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


person Max    schedule 12.06.2016    source источник


Ответы (1)


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

person mlucy    schedule 12.06.2016
comment
Спасибо mlucy. Я собираюсь попробовать карту чисел как строк для значений. (Я хотел бы сохранить питомцев в порядке, и если бы я вводил ключ по имени [сопоставление имени и значения], мне нужно было бы отслеживать порядок через другой массив.. .который мне нужно будет обновить, если какое-либо из имен изменится.) - person Max; 13.06.2016
comment
Хорошо, то, что я в итоге сделал, было несколько гротескным, но в любом случае это проект для хобби. Я только что получил весь объект, внес необходимые изменения, а затем вернул все обратно (replaced весь документ). Простой, относительно легкий и никаких хаков... кроме того, что он не атомарный и довольно неэффективный. - person Max; 13.06.2016