Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I modify array fields in place?

Tags:

rethinkdb

Let's say I have this object:

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

How can I directly change 2nd title "s2" to other value? without loading the object and save again? Thanks.

like image 880
PeiSong Avatar asked Dec 16 '14 15:12

PeiSong


1 Answers

Update plus the changeAt term:

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"}))
  }
}

The above is good if you already know the index of the item you want to change. If you need to find the index, then update it, you can use the .offsetsOf command to look up the index of the element you want:

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"}))
    }
  })
})

Edit: modified answer to use changeAt

like image 115
deontologician Avatar answered Nov 04 '22 17:11

deontologician