数组第n个元素的REQL更新属性

时间:2018-08-26 12:34:08

标签: arrays updates rethinkdb

我有以下查询-

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 :(得分:0)

数组确实很棘手...类似这样的东西:

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合并的