REQL обновить свойство n-го элемента массива
У меня есть следующий запрос -
r.db("schema").table("table")
.get("7201f732-4396-4201-9df4-099506a473b5")("observation")("items")(0)
который возвращает следующий результат -
{
"description": null ,
"index": "AF"
"name": "ALL FARM BASE" ,
"opted": true ,
"parent": null ,
"properties": [
"AF 1" ,
"AF 2"
] ,
"sub_heads": [
"CB" ,
"AB" ,
"LB"
] ,
"type": "HEAD"
}
Запроса должно быть достаточно, чтобы объяснить структуру данных, но я объясню это любыми способами. Запрос в основном выбирает первый элемент массива items
, который является свойством объекта observation
выбранного документа.
Теперь, как мне обновить description
ключ вышеуказанного запроса?
1 ответ
Массивы действительно хитры... Примерно так:
r.db("schema").table("table").get("7201f732-4396-4201-9df4-099506a473b5").update({
observations: {
items: r.row('observations')('items').changeAt(
0,
r.row('observations')('items')(0).merge({
description: 'my new description'
}))
}
})
Запроса должно быть достаточно, чтобы объяснить процесс, но я все равно объясню.;)
.get("7201f732-4396-4201-9df4-099506a473b5")
обеспечивает выбор мы будем работать над.update(...)
запустит свой аргумент для каждого документа в выделении, объединит предыдущий документ с результатом ("объединение" здесь означает, что нет необходимости предоставлять полный объект, как при использовании.replace(...)
) и, наконец, зафиксировать изменения в БД{ observations: { items: ... } }
цели, где мы собираемся работать в документе, какие ключи мы собираемся изменить (здесь только один,observations.items
) - это без потерь (объектно), потому что мы обновляем, а не заменяемr.row('observations')('items')
нацеливается на одну и ту же точку в документе (r.row
будучи "текущим обработанным документом" в контексте обработки выбора), но здесь мы обернуты возможностями ReQL, а не просто используем простой объект.changeAt(...)
изменит массив, к которому он обращается, перезаписав индекс, заданный его первым аргументом, данными, предоставленными его вторым аргументом, и вернув (не передавая) новый массивr.row('observations')('items')(0)
как раньше, но теперь идем в первый элементobservations.items
массив.merge(...)
объединяет вызываемый объект со своим аргументом, возвращая (не фиксируя) новое значение
По-английски: получить указанный документ, обновить его указанным массивом, измененным по указанному индексу, при этом новое значение будет старым, объединенным с указанным description
,