LINUX.ORG.RU

Ответ на: комментарий от silver-bullet-bfg

Просто посмотреть, что в поле _id хотелось бы.

bson-objectid->string

Он тривиален:

(bytes->string/utf-8 (base64-encode (bson-objectid-v b)))

Может ты хочешь увидеть (bson-objectid-v b), а не закодированный base64 ?

monk ★★★★★ ()
Ответ на: комментарий от silver-bullet-bfg

Как получить тогда (bson-objectid-v b)?

Вот поэтому я и просил показать, что в (hash-ref doc ’_id) возвращается. По-идее, там prefab структура, то есть из неё можно поле вытащить через (vector-ref (struct->vector id) 1).

monk ★★★★★ ()
Ответ на: комментарий от monk

Для примера (возвращается в _id то же самое):

(define tst (new-bson-objectid))

таким образом генерится uuid аналогичный монги, возвращает (аналогично, когда получаю поле с документа):

'#s(bson-objectid #"^\241\336\e>]\313!\0\0\0\1")

Преобразую в вектор как ты говорил:

(struct->vector tst)

на выходе получаю вот такое:

'#(struct:bson-objectid #"^\241\336\e>]\313!\0\0\0\1")

Теперь получаю с вектора элемент по индексу

(vector-ref (struct->vector tst) 1)

Получаю, как понимаю, строку из байт:

#"^\241\336\e>]\313!\0\0\0\1"

Если так - то как это теперь преобразовать к строке со значением UUID (т.е. по сути получить в виде строки вот эту строку)

silver-bullet-bfg ★★ ()
Ответ на: комментарий от silver-bullet-bfg

как это теперь преобразовать к строке со значением UUID

Так для этого и используется base-64. В какой кодировке ты хочешь трактовать эту последовательность байт как строку? Тем более, что нулевые символы внутри строки в любом случае неудобны.

Там нет строки. Там в качестве идентификатора набор из трёх чисел, одно из которых вещественное.

monk ★★★★★ ()
Ответ на: комментарий от monk

Если посмотреть в БД, получить запись, то там будет на месте _id что-то вроде: ObjectId("507c7f79bcf86cd7994f6c0e")

Вот я и хочу получить:

507c7f79bcf86cd7994f6c0e

как строку. Чтобы отдать её на в ответ и потом осуществлять по ней поиск (скажем получить по ней запись). Она пойдет при формировании url в «/api/v1.0/coords/:uuid»

silver-bullet-bfg ★★ ()
Последнее исправление: silver-bullet-bfg (всего исправлений: 2)
Ответ на: комментарий от silver-bullet-bfg
(define b #"^\241\336\e>]\313!\0\0\0\1")
(apply string-append
       (for/list ([i b])
         (number->string i 16)))
; "5ea1de1b3e5dcb210001"

осуществлять по ней поиск

А это как делать будешь? Чтобы его передать в mongo-collection-find, надо сконструировать структуру bson-objectid. Её сделать можно либо новую через new-bson-objectid, либо из string->bson-objectid по строке, которая получена через bson-objectid->string

monk ★★★★★ ()
Ответ на: комментарий от monk

Ого. Однако. По идее строку так же перегонять в байты, на их основе собирать ObjectID, не? Ну и если память не изменяет, то монге можно толкнуть строку.

silver-bullet-bfg ★★ ()
Последнее исправление: silver-bullet-bfg (всего исправлений: 1)
Ответ на: комментарий от silver-bullet-bfg

:-)

Всё тебе странного хочется…

Я накосячил с конвертацией. (number->string 0 16) даёт «0», а надо два знака.

(define b #"^\241\336\e>]\313!\0\0\0\1")
(define s
  (apply string-append
         (for/list ([i b])
           (string-append (if (< i 16) "0" "")(number->string i 16)))))
(define rec (list->bytes
             (for/list ([n (in-range 0 (string-length s) 2)])
               (string->number (substring s n (+ n 2)) 16))))

rec = b

monk ★★★★★ ()