2011-11-10 20 views
12

Tengo una aplicación de Android que envía datos json al script PHP. El script PHP tiene que guardar los datos en MongoDb.Inserte JSON en MongoDb directamente desde PHP

Cuando inserto los datos, MongoDb trata estos datos como una cadena.

$ conn = new Mongo ('mongodb: //127.0.0.1: 27017');

// access database 
$db = $conn->Data; 

// access collection 
$collection = $db->Collection; 
$collection->insert($myjson) 

¿Cómo puedo decir al controlador MongoDb PHP que ya es un documento json.

Gracias

Respuesta

16

El PHP MongDB controlador acepta matrices de los aislantes y consultas (ver aquí: http://www.php.net/manual/en/mongo.queries.php)

por lo que necesita para convertir su JSON a una matriz.

Por suerte, en general esto es bastante fácil ... aquí es un fragmento de una pieza de código más largo (ver este article) para insertar datos JSON de la API de Twitter en una matriz, entonces en MongoDB:

// Convert JSON to a PHP array 
$usertimeline = json_decode($usertimeline); 

// Loop array and create seperate documents for each tweet 
foreach ($usertimeline as $id => $item) { 
    $collection->insert($item); 
} 

Tenga en cuenta json_decode() allí que convierte el JSON en una matriz de PHP.

+6

¿Cómo manejaría la inserción de tipos de datos nativos como Mongo MongoDate? – karnage

0

MongoDB utiliza BSON no JSON lo que necesita para volver a codificar todos modos. Además, recuerdo haber hablado con kchodorow sobre esto y la interfaz en bruto no fue expuesta en ese momento (hace al menos medio año) y dudo que sea así, incluso si logras obtener datos de BSON de algún lugar, no puedes evitar el /codificar.

2

Aquí hay un consejo para los demás que quieran hacer esto, pero quieren actualizar los registros en lugar de insertar los nuevos. Con el fin de conseguir el enfoque de Justin a trabajar, tenía que asegurarse de que puedo convertir el objeto _id para cada elemento a un MongoId:

// Convert JSON to a PHP array 
$usertimeline = json_decode($usertimeline); 

// Loop array and create seperate documents for each tweet 
foreach ($usertimeline as $id => $item) { 
    $mongo_id = new MongoId($id); 
    $item->_id = $mongo_id; 
    $collection->update(array('_id' => $mongo_id), $item); 
}