ArangoDB AQL Upsert操作更新时清除CreateDate而非仅插入时设置
ArangoDB AQL Upsert更新时清空CreateDate字段的原因及解决办法
问题原因
你遇到的问题根源在UPDATE语句的MERGE(entity, { UpdatedDate: DATE_ISO8601(DATE_NOW()) })逻辑里:
如果传入的entity对象中CreateDate字段为null、undefined,或者根本没有这个字段,MERGE后生成的更新文档会包含这个空值(或明确的null)。ArangoDB的UPDATE操作会严格按照你传入的文档结构覆盖原数据,原文档中已存在的CreateDate就会被这个空值覆盖,导致被清空。
而插入时正常,是因为INSERT是创建全新文档,MERGE后的CreateDate是通过DATE_ISO8601(DATE_NOW())生成的有效值,不存在空值覆盖的情况。
解决办法
有两种常用的修正方式,根据你的实际需求选择:
方式一:移除entity中的CreateDate后再合并更新字段
如果entity中还有其他需要更新的字段,只是要排除CreateDate,可以用UNSET函数先移除entity里的CreateDate,再和UpdatedDate合并:
UPSERT { _key: entity._key } INSERT MERGE(entity, { CreateDate: DATE_ISO8601(DATE_NOW()), UpdatedDate: DATE_ISO8601(DATE_NOW()) }) UPDATE MERGE(UNSET(entity, 'CreateDate'), { UpdatedDate: DATE_ISO8601(DATE_NOW()) }) IN @@collectionName
方式二:直接指定更新字段(仅更新UpdatedDate)
如果更新操作只需要修改UpdatedDate,无需同步entity中的其他字段,直接构造更新对象即可:
UPSERT { _key: entity._key } INSERT MERGE(entity, { CreateDate: DATE_ISO8601(DATE_NOW()), UpdatedDate: DATE_ISO8601(DATE_NOW()) }) UPDATE { UpdatedDate: DATE_ISO8601(DATE_NOW()) } IN @@collectionName
内容的提问来源于stack exchange,提问作者Shahar Shokrani
相关产品推荐
相关产品推荐

