Convertir datos de mysql a mongodb
filed in código, mongodb on mar.21, 2010
Para un proyecto personal en el que estoy utilizando ExtJs he decidido abandonar MySql en favor de MongoDB.
Para ello, hize un dump de la base de datos e intenté importarla con mongoimport.
El caso es que mongoimport me tiraba un críptico error:
./mongoimport -d pruebas -c piedras stones.json
me daba siempre
imported 1 objects
encountered 1 error
harto de encontrar una salida para este problema, decidí volcarlo a json yo mismo con PHP
encontré la clase SimpleMongoPHP y con unas pocas líneas de código conseguí extraer los datos de Mysql y directamente insertarlos en MongoDB.
Dejo el código aquí a modo de máquina del tiempo por si lo vuelvo a necesitar.
require "Db.php";
//crear primero la colección con phpmoadmin a mano
$mongo = new Mongo("localhost:27017");
define('MONGODB_NAME', 'prueba');
$conn = mysql_connect('localhost', 'root', '*****') or die('no conecto');
$db_selected = mysql_select_db('stones', $conn);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}
$sql = "SELECT * FROM stones";
$result = mysql_query($sql, $conn);
while ($row = mysql_fetch_assoc($result)) {
$_ = array();
foreach ($row as $k => $v){
$_[$k] = utf8_encode ($v);
}
Db::batchInsert('piedras',array($_));
}
como se ve en el código, la madre del cordero está en el método Db::batchInsert que nos permite insertar un array en una colección de MongoDB del tirón.
PD: cuidado con el encoding, parece ser que MongoDB requiere que el texto que le introduzcamos esté en UTF8, así que ya sabéis, utf8_encode() para insertar y utf8_decode para leer los datos.
Dejo para la posteridad un ejemplo de un registro para el novicio
[_id] => MongoId Object (4ba5fb738ead0ed20f650100)
[id] => 86
[reference] => S0086
[picture] => 514z515
[installed_picture] => 443z444z445
[type] => 6
[color] => 13
[subtype] => Amber Onyx
[origin] => Iran
[description] =>
[uses] => Commercial & Residential, Interior & Exterior, Floor & Wall, Backsplashes, Countertops, Fireplaces, Tub Surrounds, Vanities
[other_name] => Yellow Onyx
[quarries] =>
[slug] => amber-onyx
[foto] => 1

marzo 22nd, 2010 on 0:31 am
[...] http://blog.leandro.vc/2010/03/21/convertir-datos-de-mysql-a-mongodb/ AKPC_IDS += "3536,"; [...]
enero 25th, 2012 on 18:45 pm
Actualización 25/01/2012:
< ?php
/* CONFIGURABLE */
//mysql
$database="mantis.20120125";
$tabla ="mantis_user_table";
//mongo
$db="mantis";
$coleccion="users";
/* END CONFIGURABLE */
//crear primero la colección con phpmoadmin a mano
$mongo = new Mongo("localhost:27017");
define('MONGODB_NAME', $db);
$conn = mysql_connect('localhost', 'root', '****') or die('no conecto');
$db_selected = mysql_select_db($database, $conn);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}
$sql = "SELECT * FROM $tabla";
$result = mysql_query($sql, $conn);
while ($row = mysql_fetch_assoc($result)) {
$_ = array();
foreach ($row as $k => $v){
if ($k != 'id')
$_[$k] = utf8_encode ($v);
}
$mongo->$db->$coleccion->batchInsert(array($_));
}