REQL обновить свойство n-го элемента массива - PullRequest
0 голосов
/ 26 августа 2018

У меня следующий запрос -

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 Ответ

0 голосов
/ 28 августа 2018

Массивы действительно хитры ... Примерно так:

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(...)), и, наконец, зафиксировать изменения в целях DB
  • { observations: { items: ... } }, где мы будем работать вдокумент, ключи которого мы собираемся изменить (здесь только один, observations.items) - без потерь (по объектам), потому что мы обновляем, а не заменяем
  • r.row('observations')('items'), предназначенные для той же точки вdocument (r.row является «текущим обработанным документом» в контексте обработки выбора), но здесь мы обернуты возможностями ReQL, а не просто используем простой объект
  • .changeAt(...) изменит массив, в котором он находитсявызывается, перезаписывая индекс, заданный его первым аргументом, данными, предоставленными его вторым аргументом, и возвращая (не передавая) новый массив
  • r.row('observations')('items')(0), как ранее, но теперь переходя к первому элементумассив observations.items
  • .merge(...) объединяет вызываемый объект со своим аргументом, возвращая (не передавая) новое значение

На английском языке: get указанный документ обновляет он с указанным массивом изменен на указанный индекс, новое значение является старым , объединено с указанным description.

...