MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dodaj dane do dokumentów w Mongo DB za pomocą PHP

Możesz spróbować czegoś takiego. Nie jest możliwe wykonanie wszystkich operacji Mongo db tylko na podstawie klucza jako wartości.

Pierwsze rozwiązanie zostało napisane, aby pozostać blisko projektu OP.

Zakładając, że możesz dodać klucz do year .

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

Ułatwia odniesienie do roku według jego wartości.

Na przykład, aby dodać nową wartość do data tablica dla year 2017. Możesz wypróbować poniższy kod.

Używa aktualizacji pozycyjnej $ operatora.

query część odwołująca się do tablicy, w której przechowywany jest rekord 2017.

update część za pomocą push aby dodać nowy car zapis do istniejących data tablica dla 2017 wiersz.

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

?>

Aby uzyskać dostęp do danych według roku, możesz uruchomić poniższe zapytanie.

Użyj zapytania pozycyjnego $ operatora, aby znaleźć indeks tablicy za pomocą części zapytania i odnieść się do tej wartości w części rzutowania.

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

Alternatywne rozwiązanie:

To zajmie się wszystkim, jak tylko wstawkami

Lepiej jest zapisać każdy wpis dotyczący samochodu w osobnym dokumencie.

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

Dla każdego wpisu możesz użyć:

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

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

Aby uzyskać dane dostępowe według roku, możesz użyć

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

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

Możesz wykonywać złożone zapytania za pomocą potoku agregacji i możesz dodać indeks, aby przyspieszyć odpowiedź.

Obserwacje:

Pierwsze rozwiązanie :Trudniej aktualizować/wstawiać dane, ale utrzymuje wszystko razem, dzięki czemu dane są łatwiejsze do odczytania.

Drugie rozwiązanie :Czystsze i prostsze wykonywanie operacji CRUD na dokumentach oraz wykorzystanie potoku agregacji do tworzenia złożonych zapytań.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Kafka Sink Connector nie przetwarza procesora RenameByRegex

  2. MongoDB Ruby Driver 2.5.x Problemy z rozróżnianiem wielkości liter w nazwach hostów w zestawach replik

  3. Dlaczego ten rodzaj mongo nie działa w PHP?

  4. MongoDB:Jak sprawdzić, czy pole tablicy zawiera element?

  5. Dokument podrzędny zagregowany/projektu jako dokument najwyższego poziomu w mongo