【问题标题】:Insert JSON into MongoDb directly from PHP直接从 PHP 将 JSON 插入 MongoDb
【发布时间】:2011-11-10 01:02:38
【问题描述】:

我有一个将json 数据发送到PHP 脚本的Android 应用程序。 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 文档?

谢谢

【问题讨论】:

    标签: php json mongodb


    【解决方案1】:

    PHP MongDB 驱动程序接受用于插入和查询的数组(参见此处:http://www.php.net/manual/en/mongo.queries.php

    所以你需要将你的 JSON 转换为一个数组。

    幸运的是,总的来说,这很容易......这是一段较长的代码(参见 article)的 sn-p,用于将来自 Twitter API 的 JSON 数据插入数组,然后插入 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);
    }
    

    注意 json_decode() 函数可以通过传递 true 作为第二个参数来转换为数组。

    【讨论】:

    • 您将如何处理插入 MongoDate 等原生 Mongo 数据类型?
    【解决方案2】:

    对于想要执行此操作但想要更新记录而不是插入新记录的其他人,这里有一个提示。为了让 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);
    }
    

    【讨论】:

      【解决方案3】:

      MongoDB 使用 BSON 而不是 JSON,因此无论如何您都需要重新编码。另外,我记得和 kchodorow 谈过这个问题,当时原始接口没有公开(至少半年),我怀疑现在是这样,所以即使你设法从某个地方获取 BSON 数据,你也无法避免 de /编码。

      【讨论】:

        【解决方案4】:

        由于 MongoDB PHP 库支持 JSON 到 BSON 和 BSON 到 PHP Std Class Object 的转换,您可以按照简单的步骤进行操作。

            //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

        【讨论】:

        • edit 回答您的问题,包括解释它是如何工作的以及为什么它可以解决问题中描述的问题。见How to Answer
        【解决方案5】:

        使用 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

        【讨论】:

          猜你喜欢
          • 2018-11-20
          • 2013-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-10
          • 1970-01-01
          • 2012-04-17
          相关资源
          最近更新 更多