【问题标题】:how to rewrite Mongo client code using MongoDB driver instead如何改用 MongoDB 驱动程序重写 Mongo 客户端代码
【发布时间】:2017-05-09 12:19:57
【问题描述】:

背景信息:

我有一个 PHP 脚本,它解析一个文本文件并使用它将数据插入 mongo 数据库。我正在远离旧的 Mongo PHP 驱动程序,转而使用 MongoDB\Driver 类 (http://php.net/manual/en/book.mongodb.php)

问题

我正在尝试使用新类重写一段代码,但我似乎无法让它工作 - 也就是它没有将数据写入数据库......而且我不知道如何找到错误。

旧代码:

这是旧代码:

 //database variables
 $m = new MongoClient("mongodb://127.0.0.1:27017");

 $db = "locations";
 function update_location_status($location)
 {
    global $m, $db;
    $collection = $db->locations;
    echo "<pre>".json_encode($status)."</pre>";

    try {
        $cursor = $collection->update(array('domain'=>$status['domain']) , array('$set'=>$status), array('upsert'=>true) ); 
        echo "Successfully upserted location status record for ". $location['domain'] ." into database...<BR>";
        return true;        
    } catch(MongoCursorException $e) {
        var_dump($cursor);
        return false;
    }

新代码

    $m = new \MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");
    function update_location_status($location)
    {
    global $m;
    echo "<pre>".json_encode($status)."</pre>";
    $bulk = new MongoDB\Driver\BulkWrite;
    $bulk->update(
        [array('domain'=>$status['domain'])],
        [array('domain'=>$status)],
        ['multi' => false, 'upsert' => true]
    );

    try{
        $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
        $result = $m->executeBulkWrite('db.locations', $bulk, $writeConcern);
        if($result->getInsertedCount()){
            return true;
        }else{
            echo "<font color=red><pre>";
            var_dump($result->getWriteErrors());
            echo "</pre></font>";

            return false;
        }
    } catch(MongoCursorException $e) {
        var_dump($result);
        return false;
    }

结果

我尝试使用getWriteErrors 转储错误消息返回一个空数组:

array(0) {
}

任何建议将不胜感激。

编辑 1

所以我更新了代码并且它正在创建数据,但它看起来与以前/旧代码不同。 这是旧代码中的数据的样子:

{ "_id" : ObjectId("584586312a0d63c2e21eee12"), 
    "bbn" : "133", 
    "customized" : true, 
    "nep" : "812", 
    "pdate" : ISODate("2017-02-05T06:44:41Z"), 
    "domain" : "test.mydomain", "status" : false, "t_name" : "agcab", "type" : "current_status" 
}

使用以下代码:

global $m, $db;
echo "<pre>".json_encode($status)."</pre>";
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    ['domain'=>$status['domain']],
    ['$set'=>['domain'=>$status]],
    ['multi' => false, 'upsert' => true]
);

数据最终看起来像:

{ "_id" : ObjectId("5910da5d99077b6b4887582f"), 
    "domain" : { 
        "bbn" : "133", 
        "nep" : "812", 
        "type" : "current_status", 
        "pdate" : ISODate("1970-01-18T07:00:12.882Z"), 
        "status" : false, 
        "domain" : "test.mydomain", 
        "tenant_name" : "agcab", 
        "customized" : true 
    } 
}

我不希望它嵌套在另一个“域”数组下。

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

    您应该将代码更新为以下内容。

     $bulk->update(
         ['domain'=>$status['domain']],
         ['$set'=>$status],
         ['multi' => false, 'upsert' => true]
     );
    
    $result = $m->executeBulkWrite(dbname.collectionname, $bulk, $writeConcern);
    

    【讨论】:

    • 我只需要调整您的代码以将“['$set'=>['domain' =>$status]]”更改为“['$set'=>$status ],"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多