更新符合特定条件的数组元素
Updating array elements that matches a specific criteria
假设我有以下数组
var data = [{ id: 0, points: 1 }, { id: 1, points: 2 }]
我想更新我的 table 其中包含
{
"doc-1": {
"id": "abcxyz123",
"entries": [
{ "id": 0, "points": 5 },
{ "id": 1, "points": 3 },
{ "id": 2, "points": 0 }
]
}
}
以便我将数据数组中的点字段添加到 "doc-1" 中 "entries" 数组中与数据数组中的相应 id 匹配的每个元素的点字段。最终结果如下:
{
"doc-1": {
"id": "abcxyz123",
"entries": [
{ "id": 0, "points": 6 },
{ "id": 1, "points": 4 },
{ "id": 2, "points": 0 }
]
}
}
如何在 ReQL 中编写这样的查询?
我假设 table 中的实际文档现在看起来像这样:
{
"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'))
});
});
})
}
})
假设我有以下数组
var data = [{ id: 0, points: 1 }, { id: 1, points: 2 }]
我想更新我的 table 其中包含
{
"doc-1": {
"id": "abcxyz123",
"entries": [
{ "id": 0, "points": 5 },
{ "id": 1, "points": 3 },
{ "id": 2, "points": 0 }
]
}
}
以便我将数据数组中的点字段添加到 "doc-1" 中 "entries" 数组中与数据数组中的相应 id 匹配的每个元素的点字段。最终结果如下:
{
"doc-1": {
"id": "abcxyz123",
"entries": [
{ "id": 0, "points": 6 },
{ "id": 1, "points": 4 },
{ "id": 2, "points": 0 }
]
}
}
如何在 ReQL 中编写这样的查询?
我假设 table 中的实际文档现在看起来像这样:
{
"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'))
});
});
})
}
})