2017-06-28 6 views
0

mongoデータベースの既存のレコードを更新するPHPロジックがあります。私は、元の文書のコピーを含むように「結果」を要求することができます方法はありPHP MongoDB Driver - 更新後に元のドキュメントを返り値としてリクエストする方法

public function update_widget($new_data) 
    { 
      try{ 
        $widget= new MongoDB\Driver\BulkWrite; 
        $widget->update(
        ['widget_id' =>$new_data['widget_id']], 
        $new_data, 
        ['multi'=> false, 'upsert'=>false] 
        );     
        $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000); 
        $result= $this->mongo_db->manager->executeBulkWrite($this->mongo_db->db.'.testcollection', $widget);            
        return $result; 
      } catch (MongoDB\Driver\Exception\BulkWriteException $e) { 
        var_dump($e->getWriteResult()->getWriteErrors()); 
      } 
    } 

: これは、コードが現在どのように見えるのですか? 私はこのドライバのPHPドキュメントを読んできましたが、私はまだ見つかっていません。古いドライバ "MongoClient"がこの機能を提供していました。

ありがとうございました。

+0

バルク書き込みを使用していません。とにかく正しく使用していません。実際には一括アップデートの一部でない限り、[findOneAndUpdate() '](https://docs.mongodb.com/php-library/master/reference/)を使用してください。メソッド/ MongoDBCollection-findOneAndUpdate /)を使用して、元のドキュメントまたは変更されたドキュメントを返すオプションを持っています。これが実際に「一括更新」の一部であれば、それは間違っているので、個々の呼び出しよりもむしろバッチ処理を作成する必要があります。 –

+0

また、間違ったドライバ 'MongoDB \ Driver'を使用しているのは、「ドライバとフレームワークの作成者」を対象とした「低レベル」のインターフェイスであり、一般的なアプリケーションでの「ユーザーランド」の使用ではありません。したがって、 "最適化"操作と特定のDSLを使用して独自のフレームワークを作成する場合を除き、代わりにPHP-Libraryドライバを使用する必要があります。概要はphp.net [Achitecture Overview](http://php.net/manual/en/mongodb.overview.php) –

+0

@NeilLunnで読むことができます。アーキテクチャの概要は参考になりました。ありがとうございました。 – dot

答えて

0

良い出発点は、コピーを入手するにはPHPドライバ

よりもずっといいこのライブラリhttps://github.com/mongodb/mongo-php-library、次のとおりです。

$collection = (new MongoDB\Client)->your->collection; 
$document = $collection->findOne(['widget_id' => $new_data['widget_id']]); 
var_dump($document); 

置き換えるには:

$updateResult = $collection->replaceOne(
    ['widget_id' => $new_data['widget_id']], 
    $new_data 
); 

printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); 
printf("Modified %d document(s)\n", $updateResult->getModifiedCount()); 

を更新するには:

$updateResult = $collection->updateOne(
    ['widget_id' => $new_data['widget_id']], 
    ['$set' => ['something' => $new_data['something']]], 
    ['upsert' => false] 
); 

printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); 
printf("Modified %d document(s)\n", $updateResult->getModifiedCount()); 
printf("Upserted %d document(s)\n", $updateResult->getUpsertedCount()); 

私はそれが役立つことを願っています

関連する問題