2015-04-23 118 views
2

我想附加到嵌套字段中的數組,我必須根據運行時信息找到它。RethinkDB:​​如何追加到嵌套結構中的數組

下面是一個例子:

r.db("test") 
    .table("test") 
    .insert({ "stock": [{ "bin":"abc", "entries":[{ "state":1 }] }] }) 

的想法是,該文件包含「股票」鍵,也就是多個「儲物箱」的數組。每個垃圾箱都有一個名字和一些條目。我需要能夠以原子方式追加到其中一個分箱中的條目,而不會影響其他分箱。

我嘗試這樣的做法:

​​

...但是,這並不在合適的水平追加,我不能肯定這是否會保留現有的垃圾桶比「ABC」等名稱。

回答

5

更新數組元素時,應該使用帶有索引的changeAt或使用map而不是使用filter

下面是查詢可能是什麼樣子:

r.table("test") 
.update(function(item){ 
    return {"stock": item("stock").map(function(stock){ 
    r.branch(stock.hasFields({"bin": "abc"}) 
     stock.merge({"entries": stock("entries").append({"state": 42})}), 
     stock)})}}) 

另外,如果你存儲在您的條目中的對象,而不是一個數組,像這樣:

{ "stock": {"abc": {"entries":[{ "state":1 }] }} } 

更新查詢可能像這樣:

r.table("test") 
.filter(r.row.hasFields({"stock": {"abc": true}})) 
.update({"stock": {"abc": r.row("stock")("abc").append({"state": 42})}}) 
+0

如果您使用的對象條目類似上面的答案的上半部分,並且正在使用nodejs驅動程序,則sinc e你不能在嵌套查詢中使用r.row,你可以做類似' .update({「stock」:{ 「abc」:r.table(「test」)。get(...) .append({「state」:42}) } },{nonAtomic:true})' – user1857711