Да, вам нужно будет получить все данные, так как нет индекса, который поможет вам здесь.
Я бы создал свой собственный «индекс» и нормализовал эти данные. У вас может быть отдельный набор из N объектов, в которых вы храните столько, сколько хотите. Вы можете начать с 10 или подумать о том, чтобы сохранить 100 для торговли некоторой (возможно, незначительной) скоростью для большей гибкости. Этот индекс может храниться на отдельном объекте «singleton», который вы добавляете как часть вашей схемы.
;; The attribute that stores the index
{:db/id #db/id[:db.part/db]
:db/ident :indexed-articles
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db.install/_attribute :db.part/db}
;; The named index entity.
{:db/id #db/id[:db.part/db]
:db/ident :articles-index}
У вас может быть функция базы данных, которая делает это. Каждый раз, когда вы вставляете новый объект, который хотите индексировать, вызовите эту функцию.
[[:db/add tempid :article/title "Foo]
[:db/add tempid :article/date ....]
[:index-article tempid 10]]
Реализация индексации статьи может выглядеть следующим образом:
{:db/id #db/id[:db.part/user]
:db/ident :index-article
:db/fn #db/fn {:lang "clojure"
:params [db article-id idx-size]
:code (concat
(map
(fn [article]
[:db/retract
(d/entid db :articles-index)
:indexed-articles
(:db/id article)])
(->> (datomic.api/entity db :articles-index)
(sort-by (fn [] ... implement me ...))
(drop (dec idx-size))))
[[:db/add (d/entid db :articles-index) :indexed-articles article-id]])}}
Отказ от ответственности: Я на самом деле не проверял эту функцию, так что, вероятно, содержит ошибки :) Основная идея заключается в том, что мы убираем любые объекты «переполнения» из набора и добавьте новый. Когда idx-size равен 10, мы хотим обеспечить, чтобы в нем было только 9 элементов, и мы добавляем в него наш новый элемент.
Теперь у вас есть сущность, которую вы можете искать по индексу,: articles-index, а 10 самых последних статей можно искать из индекса (все индексы индексируются), не вызывая полного чтения базы данных.
;; "indexed" set of articles.
(d/entity db :articles-index)
Я считаю, Индекс AVET - именно то, что вы ищете. Прочтите ответ pete23 для дальнейшего уточнения. –