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存在,则在
    区域

因此,同一条边没有重复区域,同一区域也没有重复

这是我的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 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
区域
,除了一个事务之外,是否应忽略它们?仅当它们具有相同的
状态
和/或
记录时间
时间戳时?您能否提供完整的预期结果(所有边)?如果你能解释一下你试图最终解决的问题,这也会有所帮助。我通过删除
区域
和提升
帐户
稍微改变了我的设计。通过保留
区域
我可以计算该区域中有多少帐户。有关此图表用途的更多详细信息,请访问