2015-04-23 95 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