2017-05-08 60 views
1

我有我的rethinkdb數據結構是這樣的:更新的具體數據〜蟒蛇

{ 
    "id":"123", 
    "otherId":"asd",    <== based on this 
    "list": [ 
     { 
      "id":"a", 
      "list_id":"1",   <== and based on this 
      "status":"available" <== update this 
     }, 
     { 
      "id":"b", 
      "list_id":"2", 
      "status":"available" 
     }, 
     { 
      "id":"c", 
      "list_id":"3", 
      "status":"available" 
     }, 
     { 
      "id":"d", 
      "list_id":"4", 
      "status":"available" 
     } 
    ] 
} 

如果我想更新LIST_ID = 1的狀態,我怎麼在蟒蛇怎麼辦?

我試圖做這樣的:

r.db('mydb').table('mytable').filter(r.row['Otherid'].eq("asd"))['list'].nth(0).default([]).filter(lambda doc: doc['list_id'] == "1").nth(0).default([]).update({"status":"offline"}).run() 

但它可以讓我錯誤rethinkdb.errors.ReqlQueryLogicError: Expected type SELECTION but found DATUM

UPDATE

,因爲數據是我不能用ID(主鍵)查詢沒有給。

我也試過這樣:

currentData = r.db('myDb').table('myTable') \ 
     .filter(r.row['otherId'].eq("asd"))['list'].nth(0).default([]) \ 
     .filter(lambda doc: doc['list_id'] == "1").run(con, time_format='raw') 

currentData["status"] = "offline" 

r.db('mydb').table('mytable').filter(r.row['otherId'].eq("asd"))['list'].nth(0).default([]) \ 
     .update(lambda row: row.merge({'list': row['list'].map(lambda row2: r.branch(row2['list_id'].eq("1"), currentData, row2))})) \ 
     .run(con, time_format='raw') 

但追加新的數據,而不是udpdate

謝謝...

回答

2

您需要使用map()merge()。事情是這樣的:

r.table("mytable") \ 
.filter(r.row['otherId'] == "asd") \ 
.update({ 
    "list": r.row["list"].map(lambda item: item.merge(
     r.branch(item["list_id"] == "1", {"status": "offline"}, {}))) 
    }) 

我也建議你的表使用索引和get_all()代替filter()

如果list_idid始終是數組中唯一的list鍵下,你也可以只使用一個對象(通過唯一的ID鍵),而不是一個數組,使您的生活更輕鬆。