LINUX.ORG.RU

mongo-collection-find должен вернуть последовательность документов.

Что вообще возвращает (sequence-ref (mongo-collection-find …) 0) ?

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

Теоретически должно работать

(define s (mongo-collection-find …))
(define doc (sequence-ref s 0))
(define id (hash-ref doc '_id))
(define id-string (bson-objectid->string id))
monk ★★★★★
()
Ответ на: комментарий от monk

Не работает. Даже если просто создать ObjectId и затем его перевести в строку

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

Уже не у ноута. Но возвращает на сколько помню последовательность hasheq

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

Такое ощущение, что сама по себе bson-objectid->string отрабатывает не корректно. Сам документ возвращается корректно, остальные поля корректно получаются

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

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

bson-objectid->string

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

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

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

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

Да! Так и есть скорее всего. Мне нужен _id для того, чтобы передать его в ответ, чтобы потом этот ключ переиспользовать

silver-bullet-bfg ★★
() автор топика
Ответ на: комментарий от 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

Вот содержимое:

(define b #"^\241\336\e>]\313!\0\0\0\1")
(list (integer-bytes->integer b #t #t 0 4) (floating-point-bytes->real b #t 4 8) (integer-bytes->integer b #t #t 8 12))

; '(1587666459 0.21659518778324127 1)
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

Чем тебе идентификатор типа «XqJfpD8wnc4AAAAA» (который возвращает bson-objectid->string) в качестве url не подходит?

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

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

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

А можно ли преоборазовать эту строку обратно? Стандартно, при работе с монгой с ней и работают по идее

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

Кажется сделал. Получается вроде что-то:

(make-prefab-struct 'bson-objectid q)

где q - это как раз та строка, которую перегнали обратно в байты

silver-bullet-bfg ★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от monk

Кстати, можешь тоже попробовать в библиотеку загнать. Если ObjectId(«507c7f79bcf86cd7994f6c0e») действительно в стандартной документации встречается.

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

Да. Так и сделаю в итоге. Сейчас получу рабочее решение у себя

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

Спасибо! Ты очень помогаешь. То же самое на Dlang, Ruby, Node я вполне хорошо представляют. А вот как сделать на Racket временами бывают затыки

silver-bullet-bfg ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.