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,

Другие вопросы по тегам