如何在ArangoDB中查找数组中具有特定日期(范围)的文档?

qzlgjiam  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(161)

我正在尝试查找集合中具有特定日期范围内事件的所有文档。
简化后的文档结构看起来像这样:

{
    "name": "Example document",
    "other": "property",
    "date_events": [
        {
            "start": "1963-10-12T00:00:00.000Z",
            "end": "1963-10-13T12:00:00.000Z"
        },
        {
            "start": "1970-04-20T00:00:00.000Z",
            "end": "1970-04-20T12:00:00.000Z"
        }
    ]
}

n 个文档,它们都有属性date_events,这是一个对象数组,包含 n 个事件,每个事件有startend
现在,我想查找在特定日期范围内(例如,1970-04-101970-04-28之间)包含事件的所有文档:

FOR doc IN api_documents
    FILTER (doc.date_events[*].start ANY >= "1970-04-10T00:00:00.000Z" &&
        doc.date_events[*].end ANY <= "1970-04-28T12:00:00.000Z")
    RETURN { _key: doc._key, _id: doc._id, events: doc.date_events[*] }

问题是,上面的查询是不正确的,并且结果还包含没有任何匹配事件的文档,例如,以下文档:

{
    "name": "False positive",
    "other": "property",
    "date_events": [
        {
            "start": "1966-02-24T00:00:00.000Z",
            "end": "1966-02-24T12:00:00.000Z"
        },
        {
            "start": "1979-11-26T00:00:00.000Z",
            "end": "1979-11-30T12:00:00.000Z"
        },
        {
            "start": "1980-01-31T00:00:00.000Z",
            "end": "1980-01-31T12:00:00.000Z"
        }
    ]
}

当只筛选一个属性时,我可以让它工作,例如start。但是,只要startend都在查询中,我能想到的所有查询,要么产生零结果,要么产生与输入日期范围不匹配的误报。
在查找两个属性时,ANY运算符的用法是否不正确,或者我做错了什么?

  • 谢谢-谢谢
a1o7rhls

a1o7rhls1#

当前查询将返回包含符合任一条件的date_events的所有文档。
为了确保两个条件都与一个date_event匹配,可以在子查询中筛选date_events,然后筛选非空结果,如下所示(未测试,但应该可以帮助您开始):

FOR doc IN api_documents
    LET matches = (
        FOR de IN doc.date_events
            FILTER de.start >= "1970-04-10T00:00:00.000Z" &&
                   de.end <= "1970-04-28T12:00:00.000Z"
            RETURN 1
    )
    FILTER LENGTH(matches) > 0
    RETURN { _key: doc._key, _id: doc._id, events: doc.date_events }

相关问题