RethinkDB:​​如何在嵌套结构中追加数组

Jan*_*ter 2 rethinkdb

我试图附加到嵌套字段中的数组,我必须根据运行时信息找到它.

这是一个例子:

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

这个想法是文档包含一个"stock"键,它是一个包含多个"存储箱"的数组.每个bin都有一个名称和一些条目.我需要能够原子地附加其中一个箱子中的条目,而不会影响其他箱子.

我试过这种方法:

r.db("test")
 .table("test")
 .update(function(item) {
    return {"stock": item("stock")
     .filter({ "bin": "abc" })
     .append({ "state":42 })
    }
 })
Run Code Online (Sandbox Code Playgroud)

...但是这并没有附加到正确的级别,我不确定它是否会保留名称不是"abc"的现有垃圾箱.

Atn*_*nNn 6

更新数组的元素时,应使用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)})}})
Run Code Online (Sandbox Code Playgroud)

或者,如果您将条目存储在对象而不是数组中,如下所示:

{ "stock": {"abc": {"entries":[{ "state":1 }] }} }
Run Code Online (Sandbox Code Playgroud)

更新查询可能如下所示:

r.table("test")
 .filter(r.row.hasFields({"stock": {"abc": true}}))
 .update({"stock": {"abc": r.row("stock")("abc").append({"state": 42})}})
Run Code Online (Sandbox Code Playgroud)