【问题标题】:How can I modify array fields in place?如何就地修改数组字段?
【发布时间】:2014-12-16 15:48:56
【问题描述】:

假设我有这个对象:

{
    "id":  "1a48c847-4fee-4968-8cfd-5f8369c01f64" ,
    "sections": [
    {
        "id": 0 ,
        "title":  "s1"
    } ,
    {
        "id": 1 ,
        "title":  "s2"
    } ,
    {
        "id": 2 ,
        "title":  "s3"
    }
    ]
}

如何直接将第二个标题“s2”更改为其他值?不加载对象并再次保存?谢谢。

【问题讨论】:

  • 您想在 ReQL 或其他方式中进行此更新吗?请更具体。
  • 使用 javascript api。 ReQL 是否有效并不重要。 :)
  • 它是否支持超过 20 种不同的语言很重要
  • 示例仅显示更新根字段或非数组字段并且有效。但是当我尝试 row.array[i].property = value 时,它​​不起作用。这就是我想要解决方案的原因。

标签: rethinkdb


【解决方案1】:

更新加上changeAt 术语:

r.table('blog').get("1a48c847-4fee-4968-8cfd-5f8369c01f64").update(function(row){
  return {
    sections: row('sections').changeAt(1,
        row('sections')(1).merge({title: "s2-modified"}))
  }
}

如果您已经知道要更改的项目的索引,则上述内容很好。如果你需要找到索引,然后更新它,你可以使用.offsetsOf命令来查找你想要的元素的索引:

r.table('table').get("1a48c847-4fee-4968-8cfd-5f8369c01f64").update(function(row){
  return row('sections').offsetsOf(function(x){
    return x('title').eq('s2')
  })(0).do(function(index){
    return {
        sections: row('sections').changeAt(index,
           row('sections')(index).merge({title: "s2-modified"}))
    }
  })
})

编辑:修改答案以使用changeAt

【讨论】:

  • 请注意indexesOf 现在被称为offsetsOf
  • @MikaelLirbank 已修复!谢谢。
猜你喜欢
  • 2018-07-25
  • 2014-10-29
  • 1970-01-01
  • 2019-03-18
  • 2019-02-20
  • 1970-01-01
  • 2022-10-12
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多