MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Tambahkan data di dalam dokumen di Mongo DB menggunakan PHP

Anda dapat mencoba sesuatu seperti ini. Tidak mungkin melakukan semua operasi db Mongo hanya berdasarkan kunci sebagai nilai.

Solusi pertama ditulis untuk tetap dekat dengan desain OP.

Dengan asumsi Anda dapat menambahkan kunci ke year .

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

Memudahkan untuk mereferensikan tahun berdasarkan nilainya.

Misalnya untuk menambahkan nilai baru ke dalam data larik untuk year 2017. Anda dapat mencoba kode di bawah ini.

Menggunakan pembaruan posisi $ operator.

query bagian untuk mereferensikan larik tempat catatan 2017 disimpan.

update bagian menggunakan push untuk menambahkan car baru rekam ke data yang ada larik untuk 2017 baris.

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

?>

Untuk mengakses data berdasarkan tahun, Anda dapat menjalankan kueri di bawah ini.

Gunakan posisi kueri $ operator untuk menemukan indeks array menggunakan bagian kueri dan merujuk nilai tersebut di bagian proyeksi.

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

Solusi Alternatif :

Ini akan mengurus semuanya hanya sebagai sisipan

Anda lebih baik menyimpan setiap entri mobil dalam dokumennya sendiri.

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

Untuk setiap entri, Anda dapat menggunakan:

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

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

Untuk mengakses data berdasarkan tahun, Anda dapat menggunakan

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

Kode PHP yang diperbarui:

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

Anda dapat melakukan kueri kompleks menggunakan saluran agregasi dan Anda dapat menambahkan indeks untuk membuat respons Anda lebih cepat.

Pengamatan:

Solusi Pertama :Lebih sulit untuk memperbarui/menyisipkan data, tetapi menyatukan semuanya sehingga lebih mudah untuk membaca data.

Solusi Kedua :Lebih bersih dan lebih sederhana untuk melakukan operasi CRUD pada dokumen dan menggunakan saluran agregasi untuk membentuk kueri yang kompleks.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hasil MongoDB ditetapkan untuk Agregat ()

  2. $in membutuhkan array sebagai argumen kedua, ditemukan:hilang

  3. Grup agregat MongoDB pada koleksi anak dalam dan dapatkan dokumen lengkap dengan hitungan

  4. mongorestore gagal karena BSONSize tidak valid

  5. TypeScript Mongoose mengabaikan bidang tertentu dalam hasil kueri jenis cara yang aman