Я не знаю, как это объяснить, но я напишу пример того, как я могу создать новые данные из этого с помощью 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";
}]
Монго называет этот тип концепции проекцией. Пример использования mongoshell — db.mycollection.find({"id": "2433-10"}, {"_id": 0, "SampleInfo": 1}). Операция поиска принимает 2 параметра — первый — это выражение фильтра — находит только тот документ, который соответствует значению идентификатора 2433-10. Второе — это оговорка о проекции. Там написано показать поле SampleInfo, но скрыть обязательное поле _id. Пункт проекции немного странный. Если вы включите значение 1 (истина), оно покажет только это поле, за исключением поля _id, для которого требуется это дополнительное значение 0 (ложь).
Кстати, у вас есть поле под названием id. Для Mongo всегда потребуется поле с именем _id, похожее по названию. Поскольку для Mongo требуется поле _id, вместо этого вы можете хранить свои значения в поле id в _id. Тем самым вы сэкономите место в базе данных. В противном случае обязательное поле _id будет содержать псевдослучайное значение ObjectId(), которое вы, вероятно, просто проигнорируете.






С некоторой начальной очисткой (заменой "=" на ":" и "/" на ";") может быть, это то, что вам нужно: (Предполагается, что у вас есть только один разделитель между ключом/значением и один разделитель между ключом и значением)
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>
Объяснение:
Эй, спасибо… Мне было интересно, есть ли у вас пример, как это сделать в JavaScript. Данные в формате JSON
В javascript очень похоже использование функции split()...
можешь показать пример
добавлен пример в конце моего ответа через JavaScript
не ясно, что нужно, опубликуйте новый вопрос с более подробной информацией ...
Получить строку в клиентском приложении, написать код для ее разбора, готово. SQL — неподходящий инструмент для этой работы.