sql >> Database >  >> NoSQL >> MongoDB

Voeg gegevens toe in documenten in Mongo DB met behulp van PHP

Je kunt zoiets proberen. Het is niet mogelijk om alle Mongo db-bewerkingen uit te voeren op basis van de off-key als een waarde.

De eerste oplossing is geschreven om dicht bij het ontwerp van OP te blijven.

Ervan uitgaande dat u een sleutel kunt toevoegen aan het year .

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

Maakt het gemakkelijk om naar het jaar te verwijzen op basis van zijn waarde.

Bijvoorbeeld om een ​​nieuwe waarde toe te voegen aan de data array voor year 2017. U kunt de onderstaande code proberen.

Gebruikt update positional $ telefoniste.

query deel om te verwijzen naar de array waar het 2017-record is opgeslagen.

update deel met push om de nieuwe car toe te voegen opnemen naar de bestaande data array voor 2017 rij.

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

?>

Voor toegang tot gegevens per jaar kunt u onderstaande zoekopdracht uitvoeren.

Gebruik query positional $ operator om de matrixindex te vinden met behulp van het querygedeelte en naar die waarde te verwijzen in het projectiegedeelte.

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

Alternatieve oplossing:

Dit zorgt voor alles zoals alleen invoegingen

U kunt elke auto-invoer beter in een eigen document opslaan.

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

Voor elk item kunt u gebruiken:

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

Voor toegangsgegevens per jaar kunt u gebruik maken van

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

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

U kunt complexe zoekopdrachten uitvoeren met behulp van een aggregatiepijplijn en u kunt een index toevoegen om uw reactie sneller te laten verlopen.

Opmerkingen:

Eerste oplossing :Moeilijker om gegevens bij te werken/in te voegen, maar houdt alles bij elkaar zodat gegevens gemakkelijker te lezen zijn.

Tweede oplossing :Schooner en eenvoudiger om CRUD-bewerkingen op documenten uit te voeren en gebruik een aggregatiepijplijn om complexe query's uit te voeren.



  1. Hoe selderij-redis configureren in django-project op Microsoft Azure?

  2. hoe sleutels te krijgen die niet overeenkomen met een bepaald patroon in redis?

  3. mongodump-fout 'locale::facet::_S_create_c_locale naam niet geldig'

  4. Volgorde automatisch verhogen in mongodb met java