LoginSignup
5
5

More than 5 years have passed since last update.

RDBMSのデータをMongoDBに突っ込むアイディア

Last updated at Posted at 2016-03-14

これってRDBMSでなくても良いんでは?みたいなテーブルがあったとして
じゃあNoSQLにデータ突っ込んでみて、パフォーマンスとか使い勝手を、ささっと検証してみたいな、というときのデータ移行のアイディアメモ

  • RDBMS=MySQL
  • NoSQL=MongoDB
mysqlデータイメージ
| id | name1 | name2  | name3 |
| 10 | あああああ | いいいいい | ううううう | 

↑このテーブルを↓こんな感じに移行したい

mongodbデータイメージ
> db.table_name.findOne();
{
    "_id" : ObjectId("56e0f29de1382344d936be92"),
    "id" : "10",
    "name1" : "あああああ",
    "name2" : "いいいいい",
    "name3" : "ううううう"
}

移行用の簡易PG(PHP7)

<?php

// MongoDB接続
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

// MySQL接続
$mysqli = new mysqli('localhost', 'user_name', 'password', 'db_name');

// カウンタ
$start = 0;
$limit = 1000; //{$limit}件ずつでcommit的な

while ($cnt > 0) {

  $query = "SELECT * FROM table_name LIMIT " . $start . ", " . $limit;

  if ($result = $mysqli->query($query)) {
    $bulk = new MongoDB\Driver\BulkWrite;
    while ($obj = $result->fetch_assoc()) {
      $bulk->insert($obj);
    }
    $manager->executeBulkWrite('db_name.table_name', $bulk);
  }
  $result->free();

  $cnt = $cnt - $limit;
  $start = $start + $limit;
}

$mysqli->close();
?>

(注意)
* PHP7はMongoDBのExtensionの関数名とか使い方とか旧バージョンと変わってる
* 当方、MongoDBあまり触ったことないです。close処理とか大量データのbulk処理は適当
* ちゃんとした書き方は追って勉強する
* 上記PGでひとまず目的は達成できた。mbp上に作ったVM環境で、100万件の移行が10分程度

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5