MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Добавете данни в документи в Mongo DB с помощта на PHP

Можете да опитате нещо подобно. Не е възможно да се изпълнят всички операции на Mongo db само на базата на ключ като стойност.

Първото решение е написано, за да остане близо до дизайна на OP.

Ако приемем, че можете да добавите ключ към year .

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

Улеснява справянето с годината по нейната стойност.

Например за добавяне на нова стойност в data масив за year 2017. Можете да опитате кода по-долу.

Използва позиция за актуализиране $ оператор.

query част за препратка към масива, където се съхранява запис 2017.

update част с помощта на push за да добавите новата car запис към съществуващите data масив за 2017 ред.

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

?>

За достъп до данни по години можете да изпълните заявката по-долу.

Използвайте позиционна заявка $ оператор за намиране на индекса на масива с помощта на частта за заявка и препратка към тази стойност в проекционната част.

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

Алтернативно решение:

Това ще се погрижи за всичко като само за вмъквания

По-добре е да запазите всеки запис на автомобил в отделен документ.

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

За всеки запис можете да използвате:

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

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

За достъп до данни по години можете да използвате

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

Актуализиран 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"; 
  } 
?>

Можете да изпълнявате сложни заявки, като използвате тръбопровод за агрегиране и можете да добавяте индекс, за да направите отговора си по-бърз.

Наблюдения:

Първо решение :По-трудно за актуализиране/вмъкване на данни, но държи всичко заедно, така че данните са по-лесни за четене.

Второ решение :По-чисто и по-лесно за извършване на CRUD операции върху документи и използване на тръбопровод за агрегиране за предварително формиране на сложни заявки.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да оптимизирате MongoDB заявка с $gt и $lte?

  2. Не може да се разреши отхвърлянето на обещание и да се изпрати масив като отговор

  3. Как да настроите FeatureCompatibilityVersion в MongoDB

  4. Грешка:Не може да се прочете свойството 'close' на null

  5. Java MongoDB:Каква е разликата между com.mongodb.DB и com.mongodb.client