2017-05-08 4 views
1

私は私のrethinkdbにこのようなデータ構造を持っている:更新特定のデータ〜のpython

{ 
    "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のステータスを更新したい場合は、私はPythonでどのように行うのですか?

は、私はこのようにそれを実行しようとしました:

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

の新しいデータは、あなたがmap()merge()を使用する必要があります...

答えて

2

をありがとう追加します。このような何か:

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

は、私はまた、あなたのテーブルにインデックスを使用することをお勧めし、代わりにfilter()get_all()

listキーの下で配列内で常にlist_idまたはidが一意の場合は、配列ではなくオブジェクト(ユニークIDでキー)を使用して簡単に使用できます。

関連する問題