Как импортировать файл в MongoDB с экранированными последовательностями Юникода?

Я работаю в R с фреймом данных, содержащим столбец с экранированными последовательностями Юникода:

d <- data.frame(id = 1, norm = "m\u0350pini\u0306\u030Ds\u0313u")

В конечном итоге мне нужно импортировать фрейм данных в MongoDB (я использую Compass), чтобы соответствующие символы Юникода отображались правильно. Я попытался сохранить его в простой текстовый файл с разделителями табуляции, но MongoDB обрабатывает столбец Юникода как строку; поэтому я попробовал сохранить его как json:

library(jsonlite)

j <- tojson(d,dataframe = "rows",pretty=T)

write(j,"jstest.json")

Однако это автоматически добавляет еще одну обратную косую черту к экранированным последовательностям, давая m\\u0350pini\\u0306\\u030Ds\\u0313u, что опять-таки MongoDB не интерпретирует как юникод.
Если я вручную вставляю в MongoDB документ с одинарной обратной косой чертой, появляются символы юникода, но для меня это очень непрактично ( тысячи документов).
Что я делаю не так?
Спасибо за помощь.

Я попробовал использовать mongoimport:

d <- data.frame(id=c(1,2),unicode=c("m\u0350pini\u030Ds\u03131u","a\u0350mpi\u030D\u03B7"))
js <- toJSON(d,dataframe = "rows",pretty = T)
write(js,"jstest.json")

mongoimport -d test -c newcoll --type json --file jtest.json --jsonArray

Однако в документах по-прежнему не отображаются символы:

{ "_id" : ObjectId("666b08603505c9daeb20edc7"), "id" : 1, "unicode" : "m\\u0350pini\\u030Ds\\u03131u" }
{ "_id" : ObjectId("666b08603505c9daeb20edc8"), "id" : 2, "unicode" : "a\\u0350mpi\\u030D\\u03B7" }

Единственный способ получить желаемый результат, который точно такой же, как и второй комментарий @Konrad Rudolph, - это вручную вставить документ с одинарными косыми чертами.

«но MongoDB рассматривает столбец Юникода как строку» — Что вы под этим подразумеваете? Конечно, это строка. В любом случае, как вы импортируете данные в MongoDB?

Konrad Rudolph 13.06.2024 11:37

Я принципиально не могу воспроизвести вашу проблему. Я не использую Compass, но при сохранении данных в формате TSV (я использую readr, но это не имеет особого значения) и импорте через mongoimport результирующий документ в MongoDB выглядит именно так, как ожидалось ({ "_id" : { "$oid" : "666abfb67631abad9783bf8f" }, "id" : 1, "norm" : "m͐pinĭ̍s̓u" }).

Konrad Rudolph 13.06.2024 11:47

Извините, я не понял, я имею в виду, что последовательности Юникода интерпретируются буквально, без преобразования в правильный символ. Я использую функцию добавления данных в Compass. Чего я не понимаю, так это почему, когда я импортирую json, строки типа m\\u0350pini\\u0306\\u030Ds\\u0313u интерпретируются буквально, но замена \\ на \ приводит к ошибке из-за «экранированных символов».

eazyezy 13.06.2024 14:00

Вот еще не ясно: что вы подразумеваете под «буквальным» и «правильным характером»? Является ли результат, который я показал в моем предыдущем комментарии, тем, чего вы ожидаете? Если да, то проблема, похоже, связана с функцией импорта Compass, а не с R (и не с MongoDB). Попробуйте использовать mongoimport.

Konrad Rudolph 13.06.2024 14:08

@KonradRudolph Я следовал инструкциям из вашего второго комментария и добился успеха, спасибо! Сделайте репост в качестве ответа, если позволите, я с радостью проголосую за него.

eazyezy 13.06.2024 17:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Внутри R экспортируйте данные в TSV (например, через readr):

    readr::write_tsv(d, 'd.tsv')
    
  2. Используйте mongoimport для импорта данных:

    mongoimport --db mydb --collection mycollection --type tsv --file d.tsv --headerline
    

Другие вопросы по теме