我有一个Android应用程序,它将json
数据发送到PHP脚本。
PHP脚本必须将数据保存到MongoDB中。
当我插入数据时,MongoDB将此数据视为字符串。
$conn = new Mongo('mongodb://127.0.0.1:27017');
// access database
$db = $conn->Data;
// access collection
$collection = $db->Collection;
$collection->insert($myjson)
如何向MongoDB PHP驱动程序说它已经是json
文档?
由于
答案 0 :(得分:18)
PHP MongDB驱动程序接受插入和查询的数组(请参阅此处:http://www.php.net/manual/en/mongo.queries.php)
因此您需要将JSON转换为数组。
幸运的是,一般来说这很容易......这是一段代码片段(请参阅此article),将来自Twitter API的JSON数据插入数组,然后插入MongoDB:< / p>
// 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);
}
请注意 json_decode() 将JSON转换为PHP数组。
答案 1 :(得分:4)
以下是其他想要执行此操作的提示,但希望更新记录而不是插入新记录。为了让Justin的工作方法,我必须确保将每个项目的_id对象转换为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);
}
答案 2 :(得分:0)
MongoDB使用BSON而非JSON,因此您无论如何都需要重新编码。另外,我记得和kchodorow谈论过这个问题,并且原始接口没有曝光(至少半年),我怀疑它现在是如此,即使你设法从某个地方获得BSON数据,你也无法避免de /编码。
答案 3 :(得分:0)
由于MongoDB PHP库支持从JSON到BSON以及从BSON到PHP Std类对象的转换,因此您可以按照简单的步骤进行操作。
//Convert Row (Document) to json
$json_row = json_encode($row);
//Convert JSON to BSON
$bson = \MongoDB\BSON\fromJSON($json_row);
//Convert BSON to PHP Std Class object
$row = \MongoDB\BSON\toPHP($bson);
// Insert Record to Document
$collection->insertOne($row);
您可以从此处获取完整的MongoDB数据库备份和还原脚本 https://github.com/sulochanatutorials/php-mongodb-backup-restore
答案 4 :(得分:0)
使用 PHP 7 驱动程序更新 2021:
假设您的 json 字符串是
$myjson = {"name":"foo", "age":30}
先用 PHP json_decode 解码。返回一个数组。
$myarraydata = json_decode($myjson)
现在可以直接插入到mongoDB中了
$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->insert($myarraydata);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $connection->executeBulkWrite('dbname.collection_name', $bulk, $writeConcern);
查看批量操作官方文档here。