2016-03-08 10 views
6

私は巨大なデータセットのPHPを使用してmongo dbの2つのフィールドを連結しようとしています。以下は、これまでに見つけて試したサンプルソリューションですが、これはPHPでは動作しません。以下のコードのいずれかがあれば、誰でも必要な修正を行うことができます。PHPを使用してmongo dbのフィールドを連結

var pipeline = [ 
     { 
      "$project": { 
      "data1": 1, 
      "data2": { $concat: [ "$data1", " ", "$data2" ] } 
      } 
     } 
], 
cursor = db.collection.aggregate(pipeline), 
bulkUpdateOps = cursor.map(function (doc) { 
    return { 
      "updateOne": { 
       "filter": { "_id": doc._id }, 
       "update": { "$set": { "data2": doc.data2 } } 
      } 
      }; 
});   
db.collection.bulkWrite(bulkUpdateOps); 

あなたが作曲コマンドを使用して、コメントで提案されているように私はモンゴ-PHPライブラリをインストールしています:

$composer require "mongodb/mongodb=^1.0.0" 

が、それは仕事をdidntの。 PHPのmongoドライバは1.6.12です。 mongo dbバージョンは3.2.3です。エラーは次のようになります。

Your version of PHP, 5.4.16, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade. 
    ./composer.json has been created 
Loading composer repositories with package information 
Updating dependencies (including require-dev) 
Your requirements could not be resolved to an installable set of packages. 

    Problem 1 

    - mongodb/mongodb 1.0.1 requires ext-mongodb ^1.1.0 -> the requested PHP extension mongodb is missing from your system. 

    - mongodb/mongodb 1.0.0 requires ext-mongodb ^1.1.0 -> the requested PHP extension mongodb is missing from your system. 

- Installation request for mongodb/mongodb ^1.0.0 -> satisfiable by mongodb/mongodb[1.0.0, 1.0.1]. 
    To enable extensions, verify that they are enabled in those .ini files: 

- /etc/php.ini 

- /etc/php.d/curl.ini 

- /etc/php.d/dom.ini 

- /etc/php.d/fileinfo.ini 

- /etc/php.d/json.ini 

- /etc/php.d/mbstring.ini 

- /etc/php.d/mysql.ini 

- /etc/php.d/mysqli.ini 

- /etc/php.d/pdo.ini 

- /etc/php.d/pdo_mysql.ini 

- /etc/php.d/pdo_sqlite.ini 

- /etc/php.d/phar.ini 

- /etc/php.d/posix.ini 

- /etc/php.d/sqlite3.ini 

- /etc/php.d/sysvmsg.ini 

- /etc/php.d/sysvsem.ini 

- /etc/php.d/sysvshm.ini 

- /etc/php.d/wddx.ini 

- /etc/php.d/xmlreader.ini 

- /etc/php.d/xmlwriter.ini 

- /etc/php.d/xsl.ini 

- /etc/php.d/zip.ini 

    You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode. 

    Installation failed, deleting ./composer.json. 

このライブラリをインストールするにはヘルプが必要です。間違ったバージョンをインストールしていますか?

+0

あなたがPHPコードの試みを表示することができますか? – chridam

答えて

2

PHPでこれを解決しようとする試みを見ないと、以下のことの多くは前提に基づいているため、最適な解決策を提示することはできません。正しい解決策を導くガイドラインとして役立ちます。

$pipeline = [["$project" => ["data1" => 1, "data2" => ["$concat" => [ "$data1", " ", "$data2" ]]]]]; 
$operation = new Aggregate($databaseName, $collectionName, $pipeline, ['typeMap' => $typeMap]); 
$cursor = $operation->execute($primaryServer); 
$results = iterator_to_array($cursor); 

function mapper($doc) { 
    return [ 
     "updateOne" => [ 
      ["_id" => $doc["_id"]], 
      [ 
       "$set" => [ 
        "data2" => $doc["_id"] 
       ] 
      ] 
     ] 
    ] 
}; 

$ops = array_map("mapper", $results); 
$bulkUpdateOps = new BulkWrite($databaseName, $collectionName, $ops); 
$writeResult = $bulkUpdateOps->execute($primaryServer); 
:最低限のドライバの上に、より完全な機能を備えたAPIを実装相補 mongo-php-libraryとPHPドライバを使用

として集約パイプライン及びその後の一括更新操作を構築します

上記では、$primaryServerは、MongoDB\Driver\Serverオブジェクトのインスタンス、つまり主要なMongoDBサーバー接続の詳細を含むべきBulkWriteexecute()メソッドのパラメータです。 $typeMap変数は、Aggregate()コンストラクタのオプションのパラメータで、BSONの逆シリアル化のタイプマップを示します。これは返されたカーソルに適用されます。あなたはレガシードライバを使用している場合


、その後のMongoDB> = 2.6 < = 3.0から入手可能ですBulk Operations APIを使用して、次の操作を実行することを検討:

$client = new MongoClient(); 
$collection = $client->selectCollection("database", "collection"); 

$pipeline = array(   
    array(
     "$project" => array(
      'data1' => 1, 
      "data2" => array("$concat" => array("$data1", " ", "$data2")) 
     ) 
    ) 
); 

$batch = new MongoUpdateBatch($collection); 
$counter = 0; 

foreach ($collection->aggregate($pipeline) as $doc) { 
    $batch->add(
     array(
      "q" => array('_id' => $doc['_id']), 
      "u" => array( 
       '$set' => array(
        "data2" => $doc["data2"] 
       ) 
      ) 
     ) 
    ); 
    $counter++; 

    if ($counter % 500 === 0) { 
     $retval = $batch->execute(array('w' => 1)); 
     $counter++; 
     $batch = new MongoUpdateBatch($collection);   
    } 
} 

if ($counter > 0) { 
    $retval = $batch->execute(array('w' => 1)); 
} 
+0

@chridamさん、ありがとうございます。変数$ primaryServerと$ typeMapに含めるべきものを指定してください。私はmongo 3.2を使用しています。 – Varsha

+0

@Varsha '$ primaryServer'は、[** BulkWrite' **](http://mongodb.github.io/mongo-php-library/api/source-class-MongoDB.Operation.BulkWrite)のパラメータです。 html#11-258)インスタンスを含むべき['execute()'](http://mongodb.github.io/mongo-php-library/api/class-MongoDB.Operation.BulkWrite.html#_execute)メソッド'MongoDB \ Driver \ Server'オブジェクト、つまり主MongoDBサーバの接続の詳細を表示します。 '$ typeMap'変数は、BSON逆シリアル化のための型マップを示す' Aggregate() 'コンストラクタのオプションのパラメータです。これは返されたカーソルに適用されます。 – chridam

5

は助けありがとうございました私は上記の解決策が私のために働かなかったので、mongo phpライブラリをインストールすることができませんでした。私はシェルコマンドを使用した2つのフィールドをマージするために共有したい別の方法を見つけました。 PHPファイルで :

$concat_Command = "mongo < concat.sql"; 
shell_exec($concat_Command); 

concat.sql

use dbname; 
db.collection.find().forEach(function(doc){ 
    db.collection.update(
     { "_id": doc._id }, 
     { "$set": { "description": doc.title+" "+doc.description } } 
    ) 
});