sql >> Databáze >  >> NoSQL >> MongoDB

Přidejte data do dokumentů v Mongo DB pomocí PHP

Můžete zkusit něco takového. Není možné provádět všechny operace Mongo db pouze na základě klíče jako hodnoty.

První řešení je napsáno tak, aby zůstalo blízko návrhu OP.

Za předpokladu, že můžete přidat klíč k year .

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

Usnadňuje odkazování na rok podle jeho hodnoty.

Například pro přidání nové hodnoty do data pole pro year 2017. Můžete vyzkoušet níže uvedený kód.

Používá aktualizaci poziční $ operátor.

query část odkazující na pole, kde je uložen záznam 2017.

update část pomocí push přidat nové car záznam do existujících data pole pro 2017 řádek.

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

?>

Pro přístup k datům podle roku můžete spustit dotaz níže.

Použít poziční dotaz $ operátor k vyhledání indexu pole pomocí části dotazu a odkazu na tuto hodnotu v části projekce.

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

Alternativní řešení:

Tím se o vše postará jako pouhé vložky

Je lepší uložit každý záznam vozu do jeho vlastního dokumentu.

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

Pro každý záznam můžete použít:

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

PHP kód:

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

Pro přístupové údaje podle roku můžete použít

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

Aktualizovaný kód PHP:

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

Pomocí agregačního kanálu můžete provádět složité dotazy a můžete přidat index, aby byla vaše odpověď rychlejší.

Postřehy:

První řešení :Je obtížnější aktualizovat/vkládat data, ale udržuje vše pohromadě, takže data jsou snáze čitelná.

Druhé řešení :Čistější a jednodušší operace CRUD na dokumentech a použití agregačního kanálu k předkládání složitých dotazů.



  1. Výčet obchodu MongoDB

  2. Nelze se připojit k Mongo DB přes Spark

  3. Zkopírujte složku se zástupným znakem z kontejneru dockeru na hostitele

  4. Úvod do distribuované mezipaměti v Hadoopu