Как использовать набор/пересечение с большими наборами результатов из MongoDB

У меня есть функция photos-with-keyword-starting, которая получает списки фотографий для заданного ключевого слова из экземпляра MongoDB с помощью monger, и другая, которая находит подмножества этих фотографий с помощью set/intersection.

(defn photos-with-keywords-starting [stems]
  (apply set/intersection
         (map set
              (map photos-with-keyword-starting stems))))

Раньше я думал, что это работает нормально, но поскольку добавлено больше записей, пересечение не работает должным образом — оно пропускает множество записей, которые содержат оба ключевых слова.

Я заметил, что вызовы функции photos-with-keyword-starting всегда возвращают максимум 256 результатов:

=> (count (photos-with-keyword-starting "lisa"))
256

Вот код этой функции:

(defn photos-with-keyword-starting [stem]
  (with-db (q/find {:keywords {$regex (str "^" stem)}})
    (q/sort {:datetime 1})))

Так как вызовы для поиска записей в MongoDB не возвращают все записи, если их больше 256, я не получаю правильные подмножества при указании более одного ключевого слова.

Как увеличить этот лимит?


person Eric Clack    schedule 02.04.2018    source источник
comment
если вам не нужно также хранить дату как дату joda на карте, вы можете преобразовать ее с помощью функции bean: (update data :datetime bean). В противном случае вы можете использовать набор с пользовательским равенством: clojuredocs.org/clojure.core/sorted-set -от   -  person leetwinski    schedule 02.04.2018
comment
Можете ли вы предоставить полный пример, который воспроизводит это поведение? Я не могу придумать, но подозреваю, что это может быть связано с десериализацией дат.   -  person Taylor Wood    schedule 02.04.2018
comment
Обновлен рабочим примером, который заставляет меня думать, что что-то еще вызывает ошибку, а не устанавливает пересечение...   -  person Eric Clack    schedule 02.04.2018
comment
Это дубликат этого вопроса: stackoverflow.com/questions/ 38648102/   -  person Eric Clack    schedule 02.04.2018


Ответы (1)


Вы можете просто преобразовать дату и время в своей функции photos-with-keyword-starting, например, в строку, если вы можете с этим жить.

В качестве альтернативы вы можете удалить логические дубликаты из своего вывода, например, так:

(->> 
  -your-result-  
  (group-by #(update % :datetime str)) 
  (map (comp first val)))
person clojureman    schedule 02.04.2018
comment
Спасибо за ответ. Однако оказывается, что вариации DateTime не были причиной ошибки, на самом деле это было ограничение запроса по умолчанию для торговцев. Я переписал вопрос соответственно. - person Eric Clack; 03.04.2018