MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Ajouter des données dans des documents dans Mongo DB à l'aide de PHP

Vous pouvez essayer quelque chose comme ça. Il n'est pas possible d'effectuer toutes les opérations de la base de données Mongo en se basant uniquement sur la clé en tant que valeur.

La première solution est écrite pour rester proche de la conception d'OP.

En supposant que vous puissiez ajouter une clé à l'year .

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

Facilite le référencement de l'année par sa valeur.

Par exemple pour ajouter une nouvelle valeur dans les data tableau pour year 2017. Vous pouvez essayer le code ci-dessous.

Utilise la position de mise à jour $ opérateur.

query partie pour référencer le tableau où l'enregistrement 2017 est stocké.

update partie en utilisant push pour ajouter la nouvelle car enregistrer dans les data existantes tableau pour 2017 rangée.

<?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";
    }

?>

Pour accéder aux données par année, vous pouvez exécuter la requête ci-dessous.

Utiliser la position de requête $ opérateur pour trouver l'index du tableau à l'aide de la partie requête et référencer cette valeur dans la partie projection.

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

Solution alternative :

Cela prendra soin de tout comme de simples inserts

Il vaut mieux enregistrer chaque entrée de voiture dans son propre document.

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

Pour chaque entrée, vous pouvez utiliser :

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

Code 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;
 }

Pour accéder aux données par année, vous pouvez utiliser

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

Code PHP mis à jour :

<?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"; 
  } 
?>

Vous pouvez effectuer des requêtes complexes à l'aide du pipeline d'agrégation et vous pouvez ajouter un index pour accélérer votre réponse.

Observations :

Première solution  :plus difficile à mettre à jour/insérer des données, mais garde tout ensemble pour faciliter la lecture des données.

Deuxième solution  :Plus propre et plus simple pour effectuer des opérations CRUD sur des documents et utiliser un pipeline d'agrégation pour effectuer des requêtes complexes.