Как мне импортировать данные в mongodb с sql-сервера?

как мне импортировать данные в mongodb с сервера sql?

У меня есть эти таблицы в базе данных sql со следующими столбцами

Государства, города, города

States
Id Name

Cities
Id Name StatesId

CitiArea

Id Name CityId

и мне нужны данные в mongoDb.

{
      State:"Orissa",
      Cities:{
                CitiName:"Phulbani",
                CitYArea:{
                              "Phulbani","Phulbani2","Pokali","Madira"
                         }
             }
}

Есть ли какие-либо инструменты или мне нужно написать код для этого преобразования данных?

Ответ 1

Существует несколько возможных способов подходить к этому при написании кода на вашем любимом языке выбора с помощью соответствующих API-интерфейсов для выбора данных, их преобразования и затем вставки в MongoDB.

Вы также можете сделать это с использованием языка запросов SQL, MongoDB и оболочки. Один простой способ - выбрать плоские данные через SQL, выгрузить его в CSV файл, импортировать в MongoDB и использовать структуру агрегации, чтобы преобразовать его в желаемый формат.

Если вам посчастливилось использовать базу данных, поддерживающую массивы или другие способы группировки строк в отдельные типы списков, вы можете сделать один выбор и включить его в инструкцию вставки JSON или MongoDB.

В этих примерах я предполагаю, что вам нужен формат, эквивалентный документу для каждого города:

{
      State:"Orissa",
      City:{
           Name:"Phulbani",
           Area:[
                 "Phulbani","Phulbani2","Pokali","Madira"
                ]
           }
}

Примеры данных в СУБД:

asya=# select * from states;
 id |     name      
----+---------------
  1 | California
  2 | New York
  3 | Massachusetts
(3 rows)

asya=# select * from cities;
 id |     name      | states_id 
----+---------------+-----------
  1 | Los Angeles   |         1
  2 | San Francisco |         1
  3 | San Diego     |         1
  4 | New York      |         2
  5 | Brooklyn      |         2
  6 | Buffalo       |         2
  7 | Boston        |         3
(7 rows)

asya=# select * from cityarea;
 id |        name        | city_id 
----+--------------------+---------
  1 | Beacon Hill        |       7
  2 | Backbay            |       7
  3 | Brookline          |       7
  4 | Park Slope         |       5
  5 | Little Italy       |       4
  6 | SOHO               |       4
  7 | Harlem             |       4
  8 | West Village       |       4
  9 | SoMa               |       2
 10 | South Beach        |       2
 11 | Haight Ashbury     |       2
 12 | Cole Valley        |       2
 13 | Bunker Hill        |       1
 14 | Skid Row           |       1
 15 | Fashion District   |       1
 16 | Financial District |       1
(16 rows)

Простой способ с массивами:

SELECT 'db.cities.insert({ state:"' || states.name || '", city: { name: "' || cities.name || '", areas : [ ' || array_to_string(array_agg('"' || cityarea.name || '"'),',') || ']}});'
FROM states JOIN cities ON (states.id=cities.states_id) LEFT OUTER JOIN cityarea ON (cities.id=cityarea.city_id) GROUP BY states.name, cities.name;

дает вам результат, который может перейти прямо в оболочку MongoDB:

 db.cities.insert({ state:"California", city: { name: "Los Angeles", areas : [ "Financial District","Fashion District","Skid Row","Bunker Hill"]}});
 db.cities.insert({ state:"California", city: { name: "San Diego", areas : [ ]}});
 db.cities.insert({ state:"California", city: { name: "San Francisco", areas : [ "Haight Ashbury","South Beach","SoMa","Cole Valley"]}});
 db.cities.insert({ state:"Massachusetts", city: { name: "Boston", areas : [ "Beacon Hill","Brookline","Backbay"]}});
 db.cities.insert({ state:"New York", city: { name: "Brooklyn", areas : [ "Park Slope"]}});
 db.cities.insert({ state:"New York", city: { name: "Buffalo", areas : [ ]}});
 db.cities.insert({ state:"New York", city: { name: "New York", areas : [ "Little Italy","West Village","Harlem","SOHO"]}});

Более длинный путь, если у вас нет поддержки типов массива или списка, заключается в выборе объединенных данных:

asya=# SELECT states.name as state, cities.name as city, cityarea.name as area 
FROM states JOIN cities ON (states.id=cities.states_id) 
LEFT OUTER JOIN cityarea ON (cities.id=cityarea.city_id);
     state     |     city      |        area        
---------------+---------------+--------------------
 California    | Los Angeles   | Financial District
 California    | Los Angeles   | Fashion District
 California    | Los Angeles   | Skid Row
 California    | Los Angeles   | Bunker Hill
 California    | San Francisco | Cole Valley
 California    | San Francisco | Haight Ashbury
 California    | San Francisco | South Beach
 California    | San Francisco | SoMa
 California    | San Diego     | 
 New York      | New York      | West Village
 New York      | New York      | Harlem
 New York      | New York      | SOHO
 New York      | New York      | Little Italy
 New York      | Brooklyn      | Park Slope
 New York      | Buffalo       | 
 Massachusetts | Boston        | Brookline
 Massachusetts | Boston        | Backbay
 Massachusetts | Boston        | Beacon Hill
(18 rows)

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

Вы можете выгружать это в интерактивном режиме или через командную строку (используйте соответствующий синтаксис для вашей РСУБД). Я сделаю это интерактивно:

asya=# \a
Output format is unaligned.
asya=# \f
Field separator is "|".
asya=# \f ,
Field separator is ",".
asya=# \t
Showing only tuples.
asya=# \o dump.txt                                                                                                                              
asya=# SELECT states.name as state, cities.name as city, cityarea.name as area 
FROM states JOIN cities ON (states.id=cities.states_id) 
LEFT OUTER JOIN cityarea ON (cities.id=cityarea.city_id);
asya=# \q

Теперь у меня есть разделенный запятыми файл с состоянием, городом и областью в виде трех полей. Я могу загрузить его в MongoDB с помощью утилиты mongoimport:

asya$ mongoimport -d sample -c tmpcities --type csv --fields state,city,area < dump.txt 
connected to: 127.0.0.1
2014-08-05T07:41:36.744-0700 check 9 18
2014-08-05T07:41:36.744-0700 imported 18 objects

Теперь, чтобы преобразовать в формат, который я хочу, я использую агрегацию:

mongo sample
MongoDB shell version: 2.6.4
connecting to: sample1
> db.tmpcities.aggregate(
{$group:{_id:"$city", state:{$first:"$state"}, areas:{$push:"$area"}}},
{$project:{state:1,_id:0,city:{name:"$_id", areas:"$areas"}}},
{$out:'cities'})
> db.cities.find({},{_id:0})
{ "_id" : "Boston", "state" : "Massachusetts", "areas" : [ "Brookline", "Backbay", "Beacon Hill" ] }
{ "_id" : "New York", "state" : "New York", "areas" : [ "West Village", "Harlem", "SOHO", "Little Italy" ] }
{ "_id" : "Buffalo", "state" : "New York", "areas" : [ "" ] }
{ "_id" : "Brooklyn", "state" : "New York", "areas" : [ "Park Slope" ] }
{ "_id" : "San Diego", "state" : "California", "areas" : [ "" ] }
{ "_id" : "San Francisco", "state" : "California", "areas" : [ "Cole Valley", "Haight Ashbury", "South Beach", "SoMa" ] }
{ "_id" : "Los Angeles", "state" : "California", "areas" : [ "Financial District", "Fashion District", "Skid Row", "Bunker Hill" ] }

Ответ 2

Попробуйте Mongify. Он заботится обо всех внешних ключах и ограничениях ссылочной целостности, которые существуют в SQL при миграции данных в MongoDB.
Согласно документации:

Mongify помогает вам перемещать ваши данные, не беспокоясь о идентификаторах или иностранных идентификаторах. Он позволяет вставлять данные в документы, включая полиморфные ассоциации.

Надеюсь, что это поможет.

Ответ 3

Для этого вы можете создать пакет служб SSIS, который позволит вам перенести строку столбца JSON и данные таблицы в базу данных MongoDB.

Вот ссылка для шагов Нажмите здесь