MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiungi dati all'interno di documenti in Mongo DB usando PHP

Puoi provare qualcosa del genere. Non è possibile eseguire tutte le operazioni di Mongo db basandosi solo su off key come valore.

La prima soluzione è scritta per rimanere vicino al design di OP.

Supponendo che tu possa aggiungere una chiave all'year .

{
  "cars": [{
      "year": "2017",
      "data": [{
          "car": "Motorolla",
          "color": "blue"
      }]
  }, {
      "year": "2016",
      "data": [{
          "car": "Toyota",
          "color": "green"
      }]
  }]
}

Rende facile fare riferimento all'anno in base al suo valore.

Ad esempio per aggiungere un nuovo valore nei data matrice per year 2017. Puoi provare il codice seguente.

Utilizza l'aggiornamento posizionale $ operatore.

query parte per fare riferimento all'array in cui è archiviato il record 2017.

update parte usando push per aggiungere la nuova car registrare nei data esistenti matrice per 2017 riga.

<?php
    try {        
        $car = 'Malibu';
        $color = 'blue';
        $years = [2017];

        $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
        $bulkWriteManager = new MongoDB\Driver\BulkWrite;

        //{"cars.year":2017}
        $query = ['cars.year' => $years[0]]; 

        //{ $push: { "cars.$.data": { "car":"chevy", "color":"black"} }}
        $update = ['$push'=> ['cars.$.data'=>['car' => $car, 'color' => $color]]];

        try {
            $bulkWriteManager->update($query, $update);  // Update Document
            echo 1;           
        } catch(MongoCursorException $e) {
            /* handle the exception */
            echo 0;
        }

        $manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager);  // Going to DB and Collection

    } catch (MongoDB\Driver\Exception\Exception $e) {
        $filename = basename(__FILE__);
        echo "The $filename script has experienced an error.\n"; 
        echo "It failed with the following exception:\n";       
        echo "Exception:", $e->getMessage(), "\n";
    }

?>

Per accedere ai dati per anno puoi eseguire la query di seguito.

Usa query posizionale $ operatore per trovare l'indice dell'array utilizzando la parte della query e fare riferimento a quel valore nella parte della proiezione.

db.collection.find({"cars.year":2017}, {"cars.$.data":1});

Soluzione alternativa :

Questo si occuperà di tutto come semplici inserti

È meglio salvare ogni voce dell'auto nel proprio documento.

{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }

Per ogni voce puoi utilizzare:

db.collection.insert({"year":2017,  "car":"Motorolla", "color":"blue"});

Codice PHP:

 //{"car":"chevy", "color":"black", year: 2017}
 $insert = ['car' => $car, 'color' => $color, 'year' => $years[0]];

 try {
    $bulkWriteManager - > insert($insert); // Inserting Document
    echo 1;
 } catch (MongoCursorException $e) {
    /* handle the exception */
    echo 0;
 }

Per accedere ai dati per anno puoi utilizzare

db.collection.find({"year":2017});

Codice PHP aggiornato:

<?php 
try { 
  $cars = ['Motorolla','Toyota', 'Corolla'] ; 
  $colors = ['blue', 'green', 'black']; 

  $years = [2017, 2016, 2015]; 
  $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); 
  $bulkWriteManager = new MongoDB\Driver\BulkWrite; 

  $query1 =["year" => $years[0]]; 
  $query2 =["year" => $years[1]]; 
  $query3 =["year" => $years[2]]; 

  $update1 = ['$set' => ['car' => $cars[0], 'color' => $colors[0]]]; 
  $update2 = ['$set' => ['car' => $cars[1], 'color' => $colors[1]]]; 
  $update3 = ['$set' => ['car' => $cars[2], 'color' => $colors[2]]]; 

  try { 
    $bulkWriteManager->update($query1, $update1, ["upsert" => true]); 
    $bulkWriteManager->update($query2, $update2, ["upsert" => true]); 
    $bulkWriteManager->update($query3, $update3, ["upsert" => true]); 
     echo 1; 
  } catch(MongoCursorException $e) { 
  /* handle the exception */ 
  echo 0; 
  } 

  $manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager); // Going to DB and Collection 

  } catch (MongoDB\Driver\Exception\Exception $e) { 
    $filename = basename(__FILE__); 
    echo "The $filename script has experienced an error.\n"; 
    echo "It failed with the following exception:\n"; 
    echo "Exception:", $e->getMessage(), "\n"; 
  } 
?>

Puoi eseguire query complesse utilizzando la pipeline di aggregazione e puoi aggiungere un indice per rendere la tua risposta più rapida.

Osservazioni:

Prima soluzione :È più difficile aggiornare/inserire i dati, ma tiene tutto insieme così è più facile leggere i dati.

Seconda soluzione :Operazioni CRUD più pulite e semplici da eseguire sui documenti e utilizzo della pipeline di aggregazione per eseguire query complesse.