sQLサーバーからmongodbにデータをインポートするにはどうすればよいですか?
私は次の列を持つSQLデータベースにこれらのテーブルを持っています
州、都市、CityAreas
州 Id名 都市 Id名州Id CitiArea Id Name CityId
そして、mongoDb Likeでデータが欲しい。
{ 州: "オリッサ"、 都市:{ CitiName: "プルバニ"、 CitYArea:{ "Phulbani"、 "Phulbani2"、 "Pokali"、 "Madira" } } }
ツールはありますか、それともこのデータ変換用のコードを記述する必要がありますか?
適切なAPIを使用して好みの言語でコードを記述し、データを選択して変換し、MongoDBに挿入することで、これにアプローチする方法がいくつかあります。
SQL、MongoDBクエリ言語、シェルを使用して行うこともできます。簡単な方法の1つは、SQLを介してフラットデータを選択し、それをCSVファイルにダンプし、MongoDBにインポートし、集計フレームワークを使用して、目的の形式に変換することです。
配列をサポートするデータベースまたは行を単一のリスト型にグループ化するその他の方法を使用できる幸運な場合は、単一の選択を行い、それをJSONまたはMongoDB挿入ステートメントに変換できます。
これらの例では、各都市のドキュメントと同等のフォーマットが必要だと想定します。
{
State:"Orissa",
City:{
Name:"Phulbani",
Area:[
"Phulbani","Phulbani2","Pokali","Madira"
]
}
}
RDBMSのサンプルデータ:
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で左外部結合を使用しました。
これをインタラクティブに、またはコマンドラインを介してダンプできます(RDBMSに適切な構文を使用します)。私はそれをインタラクティブに行います:
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
これで、3つのフィールドとして州、都市、およびエリアを含むコンマ区切りファイルができました。 mongoimport
ユーティリティを介してMongoDBにロードできます。
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" ] }
Mongify を試してください。 MongoDBでデータを移行するときに、SQLに存在するすべての外部キーと参照整合性制約を処理します。
そのドキュメントによると:
Mongifyを使用すると、IDや外部IDを気にすることなくデータを移動できます。ポリモーフィックな関連付けを含むデータをドキュメントに埋め込むことができます。
それが役に立てば幸い。