我试图在嵌套字段中追加一个数组,我必须根据运行时信息找到它。
以下是一个例子:
r.db("test")
.table("test")
.insert({ "stock": [{ "bin":"abc", "entries":[{ "state":1 }] }] })
这个想法是该文件包含" stock" key,是一个包含多个"存储箱的数组"。每个bin都有一个名称和一些条目。我需要能够原子地附加其中一个箱子中的条目,而不会影响其他箱子。
我试过这种方法:
r.db("test")
.table("test")
.update(function(item) {
return {"stock": item("stock")
.filter({ "bin": "abc" })
.append({ "state":42 })
}
})
...但是这并没有附加到正确的级别,我不确定它是否会保留名称不是" abc"的现有垃圾箱。
答案 0 :(得分: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)})}})
或者,如果您将条目存储在对象而不是数组中,如下所示:
{ "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})}})