当前位置: 首页 > 知识库问答 >
问题:

如何改用MongoDB驱动程序重写Mongo客户端代码

洪研
2023-03-14

背景资料:

我有一个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 
    } 
}

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

共有1个答案

皇甫夕
2023-03-14

您应该将代码更新到下面。

 $bulk->update(
     ['domain'=>$status['domain']],
     ['$set'=>$status],
     ['multi' => false, 'upsert' => true]
 );

$result = $m->executeBulkWrite(dbname.collectionname, $bulk, $writeConcern);
 类似资料:
  • 出身背景 我有一个远程托管服务器,它运行java vm,带有多人实时问答游戏的自定义服务器代码。服务器处理配对、房间、大厅等。我还在同一个空间使用Mongo db,其中包含手机问答游戏的所有问题。 这是我第一次尝试这样的项目,虽然我精通Java,但我的mongo技能充其量只是新手。 客户单例 我的服务器包含mongo客户端的静态单例: 注意: Mongo客户端对我来说是新的,我知道未能正确使用连池

  • 我们正在尝试使用nodejs/mongo原生驱动程序实现下面演示(幻灯片13-18)中概述的策略。 https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application 总结: 从node.js.创建到mongoDB的连接池 对于租户

  • 问题内容: 我在以下代码中: 我想打印用户代理HTTP标头,并可能对其进行更改。可能吗? 问题答案: Selenium中无法读取请求或响应头。您可以通过指示浏览器通过记录此类信息的代理进行连接来实现。 在Firefox中设置用户代理 更改Firefox用户代理的通常方法是在Firefox配置文件中设置变量。请注意,这与硒无关。 您可以指示Selenium使用与默认配置文件不同的配置文件,如下所示:

  • 我想使用. net mongo驱动程序监控当前连接池占用情况以每分钟生成统计数据(如5/MaxConnectionPoolsize繁忙)。但是我在我的驱动程序(2.8.1)中看不到任何选项。这可能吗? 对于js客户端的类似问题,我已经找到了一些答案,但遗憾的是,我无法将其应用于我的情况 如何获得MongoDB的已使用(和免费)连接数(从客户端角度)?

  • 问题内容: 从Mongodb客户端,我们可以使用db.Collection.stats()来获取集合状态,例如: +记录数(计数) +磁盘 大小(storageSize) +索引(indexSizes) +平均对象大小(avgObjSize) 现在,我想使用Mongodb Java驱动程序从Web后端监视这些数据,请让我知道如何获取它们? 我已经提到:http : //mongodb.github

  • 从Mongodb客户端,我们可以使用db.collection.stats()获取集合的状态,例如: +记录数(count) +磁盘上的大小(storageSize) +索引(indexsize) +平均对象大小(avgObjSize) 现在我想用Mongodb java驱动程序从web后端监控这些数据,请让我知道如何获取它们? 我提到了:http://mongodb.github.io/mong