我们说我有以下数组
var data = [{ id: 0, points: 1 }, { id: 1, points: 2 }]
我想更新包含
的表格 {
"doc-1": {
"id": "abcxyz123",
"entries": [
{ "id": 0, "points": 5 },
{ "id": 1, "points": 3 },
{ "id": 2, "points": 0 }
]
}
}
这样我就可以将数据数组中的points-field添加到"条目"中每个元素的points-field。数组在" doc-1"与数据数组中的相应id匹配。最终结果如下:
{
"doc-1": {
"id": "abcxyz123",
"entries": [
{ "id": 0, "points": 6 },
{ "id": 1, "points": 4 },
{ "id": 2, "points": 0 }
]
}
}
如何在ReQL中编写这样的查询?
答案 0 :(得分:3)
我认为表中的实际文档现在看起来像这样:
{
"id": "abcxyz123",
"entries": [{
"id": 0,
"points": 5
}, {
"id": 1,
"points": 3
}, {
"id": 2,
"points": 0
}]
}
没有doc-1
嵌套。
然后您的更新可以这样完成:
r.table('t1').update(
{
entries: r.row('entries').map(function(e) {
return r.do(r.expr(data)('id').indexesOf(e('id')), function(dataIndexes) {
return r.branch(
dataIndexes.isEmpty(),
e,
{
id: e('id'),
points: e('points').add(r.expr(data)(dataIndexes(0))('points'))
});
});
})
})
我正在使用map
来映射entries
和indexesOf
中的每个条目,以查找data
中的相应条目(如果存在)。
请注意,这不会向entries
列表添加新条目,而只会更新现有条目。如果您还需要添加新条目,请告诉我。
如果您的文档实际上首先包含doc-1
字段,则此查询应该完成此任务:
r.table('t1').update(
{ 'doc-1':
{
entries: r.row('doc-1')('entries').map(function(e) {
return r.do(r.expr(data)('id').indexesOf(e('id')), function(dataIndexes) {
return r.branch(
dataIndexes.isEmpty(),
e,
{
id: e('id'),
points: e('points').add(r.expr(data)(dataIndexes(0))('points'))
});
});
})
}
})