Использование поисковых шаблонов с monger
Я хочу получить доступ к базе данных Монго из clojure, используя такие шаблоны поиска:
find({Keywords: /search-pattern/})
У меня есть база данных под названием "soulflyer", содержащая коллекцию "images", и у каждого члена есть поле "Keywords", содержащее массив ключевых слов exif из изображения, которое он представляет. Чтобы найти свои изображения из Java-оболочки Монго, я делаю это:
db.getCollection('images').find({Keywords: "Iain Wood"})
и я получаю список всех записей, которые содержат ключевое слово "Iain Wood". Это также прекрасно работает в clojure, если я сделаю это в repl:
(def connection (mg/connect))
(def db (mg/get-db connection "soulflyer"))
(seq (mc/find db "images" {"Keywords" "Iain Wood"}))
Тем не менее, я хочу найти частичные совпадения по ключевым словам. Это работает нормально из оболочки Java с помощью команды, подобной этой:
db.getCollection('images').find({Keywords: /Iain/})
Как и ожидалось, я возвращаю все изображения с ключевым словом, которое содержит "Iain". Однако я не могу найти, как сделать эту работу из clojure.
(seq (mc/find db "images" {"Keywords" "/Iain/"}))
возвращает пустой список
(seq (mc/find db "images" {"Keywords" /Iain/}))
(seq (mc/find db "images" {"Keywords" '/Iain/'}))
(seq (mc/find db "images" {"Keywords" \/Iain\/}))
(seq (mc/find db "images" {"Keywords" "\/Iain\/"}))
дай мне LispReader$ReaderException или заморозь репл.
Как мне заставить clojure/monger искать простое совпадение с образцом?
1 ответ
Я не уверен, что monger поддерживает это сопоставление с образцом подстроки из коробки, но вы можете легко использовать регулярные выражения. Это задокументировано в документации запроса монгеров. Вам нужно использовать $regex
оператор. Должно работать что-то вроде следующего:
(mc/find db "images" {"Keywords" {$regex ".*Iain.*"}})