如何用ArangoDB的AQL实现数组元素的存在更新、不存在添加
用AQL实现日期值数组的增改逻辑
需求说明
有一个由{date: 日期字符串, value: 数值}对象组成的有序数组,需要实现:
- 若数组中无对应日期的对象,添加新的日期+值对象
- 若已有对应日期的对象,将新值累加到原有值上
注:新对象的日期总是晚于数组中已有日期,数组需保持有序
示例数据
- 初始数组:
[{date:"2024-10-05",value:2},{date:"2024-10-06",value:1}] - 添加
{date:"2024-10-07",value:2},因无对应日期,结果数组:[{date:"2024-10-05",value:2},{date:"2024-10-06",value:1},{date:"2024-10-07",value:2}] - 再次添加
{date:"2024-10-07",value:2},更新对应值为4,结果数组:[{date:"2024-10-05",value:2},{date:"2024-10-06",value:1},{date:"2024-10-07",value:4}]
参数为@newDate, @valueAdd,原本困惑如何用AQL实现数组版本的增改逻辑,后来改用对象存储方案解决:
对象存储替代方案
用日期字符串作为键的对象替代数组,结构示例:{"2024-10-05":2, "2024-10-06":1,"2024-10-07":4}
更新逻辑的AQL语句
let x = HAS(MyObject,@today) ? MyObject[@today] : 0 let xx = MERGE(NOT_NULL(MyObject,{}), {@today: x+@add}) UPDATE MyVertice WITH {MyObject: xx} IN MyCollection
获取最新值的AQL语句
let MyVertice = DOCUMENT("MyCollection/A") let latestDate = ATTRIBUTES(MyVertice.MyObject, true, true)[-1] return MERGE(MyVertice , {LatestValue:{[latestDate]: NOT_NULL(MyVertice.MyObject[latestDate],0)}})
内容的提问来源于stack exchange,提问作者specimen
相关产品推荐
相关产品推荐

