Элемент ключевого слова в векторе monger преобразуется в строку

Используя monger, я пишу документ, который содержит вектор с ключевым словом в коллекцию, как

(monger.collection/insert-and-return db 
                                    "test-coll" {:_id 1 :some-vector [:a-keyword]})

который возвращается, как ожидалось

{:_id 1, :some-vector [:a-keyword]}

но тогда, если я получу конкретный документ, как

(monger.collection/find-map-by-id db "test-coll" 1)

ключевое слово было изменено на строку

{:_id 1, :some-vector ["a-keyword"]}

Это ожидаемое поведение и если да, то почему?

2 ответа

Решение

Это ожидаемое поведение, поскольку хранилище базы данных mongo не поддерживает ключевые слова; это по сути json, http://clojuremongodb.info/articles/inserting.html

Вам придется вручную конвертировать значения обратно в ключевые слова, используяmonger.conversion/from-db-object,

Метод insert-and-return возвращает те же данные, которые вы передали ему, плюс идентификатор созданного документа.

(defn insert-and-return 
    [db coll _]
 ...
  (let [doc (merge {:_id (ObjectId.)} document)]
   (insert db coll doc concern)
   doc))

Метод find-map-by-id просто извлекает данные из mongodb и использует функцию from-db-object для преобразования необработанных данных в структуру данных замыкания, в которой ключевые слова карты будут подвергаться ключевым словам. Значение вашей карты не будет ключевым словом.

(from-db-object ^DBObject (find-one db coll ref) true)

;;where
(defprotocol ConvertFromDBObject
  (from-db-object [input keywordize))
Другие вопросы по тегам