Как извлечь строку в объект

Я не знаю, как это объяснить, но я напишу пример того, как я могу создать новые данные из этого с помощью SQL. это из базы данных MongoDb, и я ничего не могу изменить. Я надеялся, что кто-нибудь знает, как это выполнить с помощью метода Select.

SELECT * FROM mytable

Исходные данные

[{
        "id": "2433-10",
        "busiName": "ABC",
        "srTypeId": "2433-10",
        "nodeType": "0",
        "pathName": "home",
        "busiSort": 10,
        "SampleInfo": "1:sql test question identifiers: itemid:12345;itemname:Ford;itemid:12345; itemlocation=USA/itemDate=2014",
        "superTypeId": "002",}]

Я хочу извлечь только SampleInfo в новые данные

[{
   "1":"sql test question identifiers" 
   "itemid":"12345";
   "itemname":"Ford";
   "iteminfo":"it's car";
   "itemlocation ":"USA";
   "itemDate":"2014";
}]

Получить строку в клиентском приложении, написать код для ее разбора, готово. SQL — неподходящий инструмент для этой работы.

Bill Karwin 16.03.2022 17:52

Монго называет этот тип концепции проекцией. Пример использования mongoshell — db.mycollection.find({"id": "2433-10"}, {"_id": 0, "SampleInfo": 1}). Операция поиска принимает 2 параметра — первый — это выражение фильтра — находит только тот документ, который соответствует значению идентификатора 2433-10. Второе — это оговорка о проекции. Там написано показать поле SampleInfo, но скрыть обязательное поле _id. Пункт проекции немного странный. Если вы включите значение 1 (истина), оно покажет только это поле, за исключением поля _id, для которого требуется это дополнительное значение 0 (ложь).

barrypicker 16.03.2022 17:57

Кстати, у вас есть поле под названием id. Для Mongo всегда потребуется поле с именем _id, похожее по названию. Поскольку для Mongo требуется поле _id, вместо этого вы можете хранить свои значения в поле id в _id. Тем самым вы сэкономите место в базе данных. В противном случае обязательное поле _id будет содержать псевдослучайное значение ObjectId(), которое вы, вероятно, просто проигнорируете.

barrypicker 16.03.2022 18:01
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С некоторой начальной очисткой (заменой "=" на ":" и "/" на ";") может быть, это то, что вам нужно: (Предполагается, что у вас есть только один разделитель между ключом/значением и один разделитель между ключом и значением)

 db.collection.aggregate([
  {
    $addFields: {
      newData: {
        "$arrayToObject": {
          "$map": {
           "input": {
             $split: [
               "$SampleInfo",
               ";"
             ]
           },
           "as": "newD",
           "in": {
             "$split": [
              "$$newD",
              ":"
            ]
          }
        }
       }
     }
    }
   }
])

Объяснение:

Разделите SampleInfo на основе разделителя ";" (учитывая, что у вас есть «key1: value1; key2: value2; key3: value3» в новом массиве с именем newData. Разделите ключи и значения на основе разделителя ключ/значение ":", преобразуйте их в пару "ключ":"значение" в поле массива newData.

игровая площадка просто агрегация (Если вы хотите просто проанализировать и вывести)

обновление игровой площадки + пайплайн 4.2+ (Если вы хотите проанализировать и сохранить обратно в базу данных в новом поле: newData)

Но, как было предложено выше, предпочтительным вариантом является санация и анализ данных перед их вставкой в ​​базу данных...

То же самое через пример JavaScript:

     mongos> function stringToObj (string) {   var obj = {};    var stringArray = string.split(';');    for(var i = 0; i < stringArray.length; i++){      var kvp = stringArray[i].split(':');     if (kvp[1]){      obj[kvp[0]] = kvp[1]      }   }   return obj; }
     mongos> db.collection.find().forEach(function(d){  d.newData=stringToObj(d.SampleInfo);db.collection.save(d); } )
     mongos>

Объяснение:

  1. Определить функцию JS stringToObj (преобразование строки в объект)
  2. Переберите все документы через forEach и используйте функцию для анализа и изменения документа, добавляя новое поле newData с содержимым.

Эй, спасибо… Мне было интересно, есть ли у вас пример, как это сделать в JavaScript. Данные в формате JSON

davaid 18.03.2022 17:43

В javascript очень похоже использование функции split()...

R2D2 18.03.2022 18:00

можешь показать пример

davaid 18.03.2022 19:01

добавлен пример в конце моего ответа через JavaScript

R2D2 18.03.2022 20:38

не ясно, что нужно, опубликуйте новый вопрос с более подробной информацией ...

R2D2 22.03.2022 13:48

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