如何在ArangoDB中仅当过滤无结果时插入边文档?
ArangoDB 仅在无匹配条件时插入边文档
你需要实现的是:只有当不存在满足特定关联关系+时间范围的边文档时,才创建新的边文档。常规的UPSERT因为匹配键的限制,没法直接包含复杂的时间条件判断,用AQL的查询+聚合+条件插入组合就能解决。
示例边文档
{ "_from": "person/x", "_to": "organisation/y", "startTime": "2022-01-01T00:00:00Z", "endTime": null, "role": "roles/z" }
要检查的过滤条件
- 边的
_from、_to、role与目标值完全匹配 startTime早于当前时间endTime为空,或者endTime晚于当前时间
实现的AQL语句
把下面语句里的your_edge_collection替换成你的边集合名称:
// 查询所有符合过滤条件的边 FOR doc IN your_edge_collection FILTER doc._from == "person/x" FILTER doc._to == "organisation/y" FILTER doc.role == "roles/z" FILTER doc.startTime < DATE_ISO8601(DATE_NOW()) FILTER (IS_NULL(doc.endTime) || doc.endTime > DATE_ISO8601(DATE_NOW())) // 聚合结果,判断是否存在匹配项 COLLECT has_match = LENGTH(COLLECTIONS) > 0 // 仅当无匹配时插入新边 FOR _ IN FILTER(!has_match) INSERT { "_from": "person/x", "_to": "organisation/y", "startTime": "2022-01-01T00:00:00Z", "endTime": null, "role": "roles/z" } INTO your_edge_collection
逻辑说明
- 第一部分
FOR doc IN ...会找出所有符合你设定条件的边文档 COLLECT has_match = LENGTH(COLLECTIONS) > 0会把查询结果聚合,has_match会被设为true(有匹配)或false(无匹配)- 最后一步只在
has_match为false时执行INSERT,确保只有没有符合条件的边时才创建新文档
内容的提问来源于stack exchange,提问作者bytesnz
相关产品推荐
相关产品推荐

