FaunaDB: как разбить на страницы / подсчитать все документы за последние n дней

В названии сказано довольно много.

Желательно использовать встроенную временную метку ts, а не дополнительное поле в data.


person qwtel    schedule 11.08.2020    source источник


Ответы (1)


Для разбивки на страницы / подсчета вы можете создать такой индекс:

CreateIndex({name:"all_docs_ts",source:collection:Collection('test'),values:[{field:['ts']},{field:['ref']}]})

и затем вы можете разбивать документы на страницы, используя такой запрос:

Paginate(Range(Match('all_docs_ts'),[ToMicros(ToTime('2020-07-14T06:30:00Z'))],[ToMicros(ToTime('2020-07-14T18:59:59Z'))]))

Если вы хотите получить ссылку для возвращенного документа, вы можете использовать такой запрос:

Map(Paginate(Range(Match('all_docs_ts'),[ToMicros(ToTime('2020-07-14T06:30:00Z'))],[ToMicros(ToTime('2020-07-14T18:59:59Z'))])),Lambda(['ts','ref'],Var('ref')))

или получить полные документы:

Map(Paginate(Range(Match('all_docs_ts'),[ToMicros(ToTime('2020-07-14T06:30:00Z'))],[ToMicros(ToTime('2020-07-14T18:59:59Z'))])),Lambda(['ts','ref'],Get(Var('ref'))))

Для подсчета используйте функцию Count ():

Count(Paginate(Range(Match('all_docs_ts'),[ToMicros(ToTime('2020-07-14T06:30:00Z'))],[ToMicros(ToTime('2020-07-14T18:59:59Z'))])))

Помните, что по умолчанию Paginate () возвращает 64 документа на страницу. Вы можете увеличить пакет до 100000 документов:

Paginate(........., {size:100000})

Если набор результатов больше, чем размер, вам нужно перебрать курсор, используя после и до (вы можете найти руководство здесь).

person Luigi Servini    schedule 11.08.2020
comment
Джеп, это сработало. Я нашел несколько способов улучшить его, например, используя TimeSubtract, но основная структура осталась прежней. Тот факт, что мне приходится использовать ToMicros, заставляет меня задуматься, было бы лучше, если бы сохранение правильного типа Date в данных. - person qwtel; 13.08.2020
comment
Привет, qwtel, это очень зависит от ваших потребностей. Поле ts предоставляется бесплатно для каждого документа Fauna, и в нем хранятся данные о создании или последнем обновлении для этого конкретного документа. Вы можете создать собственное поле в данных, которое содержит Дата, представляющую метку времени, которую вы хотите использовать для фильтрации, но в этом случае вам необходимо создать соответствующий индекс. - person Luigi Servini; 13.08.2020