2016-03-08 14 views
6

Sto cercando di concatenare due campi in mongo db utilizzando php per un enorme set di dati. Di seguito è la soluzione di esempio che ho trovato e provato finora ma questo non funziona in PHP. Qualcuno può aiutare con le correzioni necessarie se del codice qui sotto.Concatenazione di campi di mongo db utilizzando php

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); 

Sto installando mongo-php-library come lei ha suggerito nei commenti utilizzando il comando compositore:

$composer require "mongodb/mongodb=^1.0.0" 

ma non ha funzionato. php mongo driver is 1.6.12. e la versione di dongo di mongo è 3.2.3. e l'errore è il seguente:

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. 

Ho bisogno di un aiuto per l'installazione di questa libreria. Sto installando la versione sbagliata?

+0

si può mostrare il codice PHP tentativi? – chridam

risposta

2

Senza il tuo tentativo di risolvere questo problema in PHP, gran parte di ciò che segue si basa su ipotesi e potrebbe quindi non offrire la soluzione migliore, ma servirà comunque come guida per orientarti nella giusta direzione per risolvere il tuo problema.

Utilizzo del driver PHP con l'omaggio mongo-php-library, che implementa un'API più completo in cima al conducente nudo-ossa, costruire la conduttura aggregazione e la successiva operazione di aggiornamento collettivo come:

$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); 

In precedenza, $primaryServer è un parametro per il metodo BulkWriteexecute() che dovrebbe contenere un'istanza dell'oggetto MongoDB\Driver\Server ovvero i dettagli della connessione del server MongoDB principale. La variabile $typeMap è un parametro facoltativo nel costruttore Aggregate() per indicare la mappa dei tipi per la deserializzazione BSON. Questo sarà applicato al cursore restituito.


Se si sta usando il driver legacy quindi prendere in considerazione l'esecuzione del seguente operazione che utilizza la Bulk Operations API che è disponibile da MongoDB> = 2.6 < = 3.0:

$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

Grazie per la risposta @chridam .. puoi specificare cosa devono contenere le variabili $ primaryServer e $ typeMap. Sto usando mongo 3.2. – Varsha

+0

@Varsha '$ primaryServer' è un parametro per [**' 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) metodo che dovrebbe contenere un'istanza dell'oggetto 'MongoDB \ Driver \ Server', ovvero i dettagli della connessione del server MongoDB principale. La variabile '$ typeMap' è un parametro facoltativo nel costruttore' Aggregate() 'per denotare la mappa Tipo per la deserializzazione BSON. Questo sarà applicato al cursore restituito. – chridam

5

Grazie a tutti per l'aiuto ma non ho potuto installare la libreria php di mongo, quindi la soluzione di cui sopra non ha funzionato per me. Ho trovato un altro modo che mi piacerebbe condividere per unire due campi che utilizzavano i comandi della shell. Nel file 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 } } 
    ) 
});