MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Fügen Sie mit PHP Daten in Dokumenten in Mongo DB hinzu

Sie können so etwas versuchen. Es ist nicht möglich, alle Mongo-DB-Operationen nur basierend auf dem Schlüssel als Wert auszuführen.

Die erste Lösung wurde so geschrieben, dass sie nahe am Design von OP bleibt.

Angenommen, Sie können dem year einen Schlüssel hinzufügen .

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

Macht es einfach, das Jahr anhand seines Werts zu referenzieren.

Zum Beispiel, um einen neuen Wert in die data einzufügen Array für year 2017. Sie können den folgenden Code ausprobieren.

Verwendet Positionsaktualisierung $ Betreiber.

query Teil, um auf das Array zu verweisen, in dem der Datensatz 2017 gespeichert ist.

update Teil mit push um das neue car hinzuzufügen Datensatz zu den bestehenden data hinzufügen -Array für 2017 Zeile.

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

?>

Für den Zugriff auf Daten nach Jahr können Sie die folgende Abfrage ausführen.

Verwenden Sie die Positionsabfrage $ Operator, um den Array-Index mithilfe des Abfrageteils zu finden und diesen Wert im Projektionsteil zu referenzieren.

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

Alternative Lösung:

Dies erledigt alles wie nur Einfügungen

Speichern Sie am besten jeden Autoeintrag in einem eigenen Dokument.

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

Für jeden Eintrag können Sie verwenden:

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

PHP-Code:

 //{"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;
 }

Für Zugriffsdaten nach Jahr können Sie verwenden

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

Aktualisierter PHP-Code:

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

Sie können komplexe Abfragen mithilfe der Aggregationspipeline ausführen und einen Index hinzufügen, um Ihre Antwort schneller zu machen.

Beobachtungen:

Erste Lösung :Schwieriger, Daten zu aktualisieren/einzufügen, hält aber alles zusammen, sodass Daten leichter zu lesen sind.

Zweite Lösung :Sauberere und einfachere Durchführung von CRUD-Vorgängen an Dokumenten und Verwendung der Aggregationspipeline zur Durchführung komplexer Abfragen.