【问题标题】:How to merge array using UPSERT?如何使用 UPSERT 合并数组?
【发布时间】:2017-11-20 11:14:06
【问题描述】:

我想将 3 个集合的结果合并到一个集合中,但我无法合并最终结果的 finishedStatus 属性。

最终结果集合:

  • 仅包含唯一状态
  • 每个文档都可以保留使该状态的机器
  • 合并finishedStatus,然后求和finishedStatus.count
  • (可选)排序完成状态[*].status

给定

集合 A

 {"status": ["1","2","3"], "machine": "A", "finishedStatus": [{"status": "4", "count": 10}, {"status": "5", "count": 1}]}
 {"status": ["4","5","6"], "machine": "A", "finishedStatus": [{"status": "3", "count": 5}, {"status": "5", "count": 11}]}

集合 B

{"status": ["1","2","3"], "machine": "B", "finishedStatus": [{"status": "1", "count": 3}, {"status": "5", "count": 14}]}
{"status": ["2","5","2"], "machine": "B", "finishedStatus": [{"status": "5", "count": 5}, {"status": "3", "count": 5}]}

集合 C

{"status": ["2","5","2"], "machine": "C", "finishedStatus": [{"status": "5", "count": 2}, {"status": "3", "count": 5}]}
{"status": ["3","2","1"], "machine": "C", "finishedStatus": [{"status": "2", "count": 6}, {"status": "4", "count": 7}]}

采集结果

{"status": ["1","2","3"], "machine": ["A", "B"] , "finishedStatus": [{"status": "1", "count": 3}, {"status": "4", "count": 10}, {"status": "5", "count": 15}]}
{"status": ["2","5","2"], "machine": ["B", "C"], "finishedStatus": [{"status": "5", "count": 7}, {"status": "3", "count": 10}]}
{"status": ["3","2","1"], "machine": ["C"], "finishedStatus": [{"status": "2", "count": 6}, {"status": "4", "count": 7}]}
{"status": ["4","5","6"], "machine": ["A"], "finishedStatus": [{"status": "3", "count": 5}, {"status": "5", "count": 11}]}

如何编写 AQL INSERT/UPDATE/UPSERT 来做出最终结果?

这是我的 AQL

FOR doc IN A
UPSERT {"status": doc.status}
INSERT {"status": doc.status, "machine": [doc.machine], "finishedStatus": doc.finishedStatus}
UPDATE {
  "machine": APPEND(OLD.machine, doc.machine, true),
  "finishedStatus": <-- I cannot write AQL to update finishedStatus
     How to write AQL to update this property?
}
IN result

谢谢

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    这是 AQL 支持的这种内联 if/else 格式:

    FOR doc IN A
    UPSERT {"status": doc.status}
    INSERT {"status": doc.status, "machine": [doc.machine], "finishedStatus": doc.finishedStatus}
    UPDATE {
      "machine": APPEND(OLD.machine, doc.machine, true),
      "finishedStatus": (
        OLD.finishedStatus[i].status == doc.finishedStatus[i].status ?
        SUM([OLD.finishedStatus[i].count, doc.finishedStatus[i].count]) : 
        APPEND(OLD.finishedStatus, doc.finishedStatus[i])
      )
    }
    IN result
    

    如果没有您的数据集,我无法对此进行测试,但请注意内联 if-then-else 格式。

    ( comparator ? is_true : is_false )

    (a == 1 ? 'one' : 'not one')

    AQL 将评估 if-then-else,然后将其替换为您提供的“真”或“假”值。

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 2020-02-07
      • 2020-08-15
      • 1970-01-01
      • 2013-11-02
      • 2023-03-09
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      相关资源
      最近更新 更多