Arangodb 如何有条件地更新UPSERT语句中的子属性?
我想按以下条件更新属性Arangodb 如何有条件地更新UPSERT语句中的子属性?,arangodb,aql,Arangodb,Aql,我想按以下条件更新属性区域: 如果区域中不存在区域R,则将新区域R推送到区域 否则,如果区域R存在,则在区域 因此,同一条边没有重复区域,同一区域也没有重复 这是我的AQL: 1 FOR t IN transactions 2 SORT t.accountId, t.recordedAt 3 COLLECT accountIds = t.accountId INTO g 4 FOR i IN 0..LENGTH(g)-2 5 LET
区域
:
- 如果
中不存在区域R,则将新区域R推送到区域
区域
- 否则,如果区域R存在,则在
区域
1 FOR t IN transactions
2 SORT t.accountId, t.recordedAt
3 COLLECT accountIds = t.accountId INTO g
4 FOR i IN 0..LENGTH(g)-2
5 LET region = g[i].t.region
6 LET doc = (i == 0)
7 ? [{"_from": "status/root", "_to": CONCAT("status/", g[0].t.status), "recordedAt": g[i].t.recordedAt, "region": region, "level": i, "accountId": accountIds}
8 ,{"_from": CONCAT("status/", g[i].t.status), "_to": LENGTH(g) > 1 ? CONCAT("status/", g[i+1].t.status) : null, "recordedAt": g[i+1].t.recordedAt, "region": region, "level": i + 1, "accountId": accountIds}]
9 : [{"_from": CONCAT("status/", g[i].t.status), "_to": LENGTH(g) > 1 ? CONCAT("status/", g[i+1].t.status) : null, "recordedAt": g[i+1].t.recordedAt, "region": region, "level": i + 1, "accountId": accountIds}]
10 FOR d IN doc
11 FILTER d._to != null
12 UPSERT {"_from": d._from, "_to": d._to, "level": d.level}
13 INSERT {"_from": d._from, "_to": d._to, "level": d.level, "regions": [{"name": d.region, "accounts": [{"id": d.accountId, "recordedAt": d.recordedAt}]}]}
14 UPDATE {
15 "regions":
16 OLD.regions[*].name ANY == d.region
17 ? PUSH(OLD.regions, {"name": d.region, "accounts": PUSH(OLD.regions[* FILTER CURRENT.name == d.region].accounts[**], {"id": d.accountId, "recordedAt": d.recordedAt})}, true)
18 : PUSH(OLD.regions, {"name": d.region, "accounts": [{"id": d.accountId, "recordedAt": d.recordedAt}]})
19 }
20 IN patterns
实际结果:
{
"_from": "status/root",
"_to": "status/A",
"level": 0,
"regions": [
{
"name": "North",
"accounts": [
{
"id": 1,
"recordedAt": "2016-08-01T00:00:00.000Z"
}
]
},
{
"name": "South",
"accounts": [
{
"id": 2,
"recordedAt": "2012-05-01T00:00:00.000Z"
}
]
},
{
"name": "North",
"accounts": [
{
"id": 1,
"recordedAt": "2016-08-01T00:00:00.000Z"
},
{
"id": 4,
"recordedAt": "2017-04-01T00:00:00.000Z"
}
]
}
]
}
预期结果:
{
"_from": "status/root",
"_to": "status/A",
"level": 0,
"regions": [
{
"name": "North",
"accounts": [
{
"id": 1,
"recordedAt": "2016-08-01T00:00:00.000Z"
},
{
"id": 4,
"recordedAt": "2017-04-01T00:00:00.000Z"
}
]
},
{
"name": "South",
"accounts": [
{
"id": 2,
"recordedAt": "2012-05-01T00:00:00.000Z"
}
]
}
]
}
样本数据:
谢谢我试图找到解决方案,但老实说,我很难理解分组标准。因此
区域
数组应该只包含每个区域名称一次,但是帐户
数组也不应该包含重复的id
s?如果存在多个事务,所有事务都具有相同的id
和区域
,除了一个事务之外,是否应忽略它们?仅当它们具有相同的状态
和/或记录时间
时间戳时?您能否提供完整的预期结果(所有边)?如果你能解释一下你试图最终解决的问题,这也会有所帮助。我通过删除区域
和提升帐户
稍微改变了我的设计。通过保留区域
我可以计算该区域中有多少帐户。有关此图用途的更多详细信息,请访问我试图找到解决方案,但老实说,我很难理解分组标准。因此区域
数组应该只包含每个区域名称一次,但是帐户
数组也不应该包含重复的id
s?如果存在多个事务,所有事务都具有相同的id
和区域
,除了一个事务之外,是否应忽略它们?仅当它们具有相同的状态
和/或记录时间
时间戳时?您能否提供完整的预期结果(所有边)?如果你能解释一下你试图最终解决的问题,这也会有所帮助。我通过删除区域
和提升帐户
稍微改变了我的设计。通过保留区域
我可以计算该区域中有多少帐户。有关此图表用途的更多详细信息,请访问