如何在ArangoDB中查询含指定日期范围事件数组的文档?
解决ArangoDB日期范围事件查询的假阳性问题
你的查询出现假阳性的核心原因是拆分了事件的start和end条件检查:doc.date_events[*].start ANY >= ... 会匹配数组里任意一个事件的start符合要求,doc.date_events[*].end ANY <= ... 会匹配数组里任意一个事件的end符合要求——这两个条件可能来自数组里的不同事件,哪怕没有单个事件同时落在目标日期范围内,文档也会被返回。
比如你提供的假阳性文档中,第一个事件的end(1966-02-24)小于目标结束日期(1970-04-28),第三个事件的start(1980-01-31)大于目标开始日期(1970-04-10),两个条件分别满足,所以文档被错误返回。
正确的AQL查询写法
有两种可靠的写法,都能确保检查的是同一个事件同时满足start和end的范围要求:
写法1:使用数组遍历统计符合条件的事件
FOR doc IN api_documents FILTER LENGTH( FOR event IN doc.date_events FILTER event.start >= "1970-04-10T00:00:00.000Z" AND event.end <= "1970-04-28T12:00:00.000Z" COLLECT WITH COUNT INTO matchCount RETURN matchCount ) > 0 RETURN { _key: doc._key, _id: doc._id, events: doc.date_events[*] }
写法2:使用ANY配合箭头函数(更简洁)
FOR doc IN api_documents FILTER doc.date_events ANY ( event => event.start >= "1970-04-10T00:00:00.000Z" AND event.end <= "1970-04-28T12:00:00.000Z" ) RETURN { _key: doc._key, _id: doc._id, events: doc.date_events[*] }
这两种写法都会检查数组中是否存在至少一个事件,其start不早于目标起始日期,且end不晚于目标结束日期,彻底避免跨事件的假阳性匹配。
内容的提问来源于stack exchange,提问作者silend
相关产品推荐
相关产品推荐

